{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Microchip 1</th>\n",
       "      <th>Microchip 2</th>\n",
       "      <th>Accepted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.051267</td>\n",
       "      <td>0.69956</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.092742</td>\n",
       "      <td>0.68494</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.213710</td>\n",
       "      <td>0.69225</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.375000</td>\n",
       "      <td>0.50219</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.513250</td>\n",
       "      <td>0.46564</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Microchip 1  Microchip 2  Accepted\n",
       "0     0.051267      0.69956         1\n",
       "1    -0.092742      0.68494         1\n",
       "2    -0.213710      0.69225         1\n",
       "3    -0.375000      0.50219         1\n",
       "4    -0.513250      0.46564         1"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "path = '../data_files/data/ex2data2.txt'\n",
    "data2 = pd.read_csv(path,header=None,names=['Microchip 1','Microchip 2','Accepted'])\n",
    "data2.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Microchip 1</th>\n",
       "      <th>Microchip 2</th>\n",
       "      <th>Accepted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>118.000000</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>118.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>0.054779</td>\n",
       "      <td>0.183102</td>\n",
       "      <td>0.491525</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.496654</td>\n",
       "      <td>0.519743</td>\n",
       "      <td>0.502060</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-0.830070</td>\n",
       "      <td>-0.769740</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-0.372120</td>\n",
       "      <td>-0.254385</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>-0.006336</td>\n",
       "      <td>0.213455</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>0.478970</td>\n",
       "      <td>0.646562</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1.070900</td>\n",
       "      <td>1.108900</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Microchip 1  Microchip 2    Accepted\n",
       "count   118.000000   118.000000  118.000000\n",
       "mean      0.054779     0.183102    0.491525\n",
       "std       0.496654     0.519743    0.502060\n",
       "min      -0.830070    -0.769740    0.000000\n",
       "25%      -0.372120    -0.254385    0.000000\n",
       "50%      -0.006336     0.213455    0.000000\n",
       "75%       0.478970     0.646562    1.000000\n",
       "max       1.070900     1.108900    1.000000"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data2.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuMAAAHjCAYAAACJlRE5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3X10nHd55//PNTMES7KK4kRDjZMQE6tNCjKOK1KU+EeUNE/rUge2oTJPDdQQ4Ff6sD60cTZ7mi6lSwItLdmGlvxMSICtozZbwN26JSRB5rhxIEprqpCESEpjYisgYcccWVKyjOb6/TEzYiyP5JE0cz/M/X6dM0cz98Pomlu3Zq753tf3+zV3FwAAAIDgpcIOAAAAAEgqknEAAAAgJCTjAAAAQEhIxgEAAICQkIwDAAAAISEZBwAAAEJCMg4AAACEhGQcAAAACAnJOAAAABCSTNgBBOnMM8/0c889N+wwAAAA0MAee+yxH7l7ezXbJioZP/fcczUwMBB2GAAAAGhgZnaw2m0pUwEAAABCQjIOAAAAhIRkHAAAAAhJomrGAQAAUPCTn/xEhw4d0osvvhh2KLG1YsUKnXXWWXrZy1625OcgGQcAAEigQ4cOqbW1Veeee67MLOxwYsfddeTIER06dEhr165d8vNQpgIAAJBAL774os444wwS8SUyM51xxhnLvrJAMg4AAJBQJOLLU4vjRzIOAAAAhIRkHAAAAFXp6elRT09PTZ/zK1/5isxMTz31VE2fdz5/8Rd/oampqUXt09/frze/+c11iYdkHAAAAKHZtWuXNm3apF27dgXy+5aSjNcTyTgAAABCcfz4ce3bt0+f+9zndO+9984uv+2229TZ2anXv/712rFjhyRpeHhYV1xxhV7/+tdr48aNGhkZkSR98pOf1Bve8AatX79et9xyiyTp2Wef1fnnn693vvOduuCCC3TddddpampKt99+u0ZHR3XZZZfpsssukyTdf//96u7u1saNG/W2t71Nx48flyT98z//s84//3xt3LhRf//3f1+3Y8DQhgAAAJhXeVnK3r17T1rW39+/5Of+6le/qmuuuUY/93M/pzPOOEOPPfaYxsbG9NWvflXf+ta31NzcrKNHj0qS3vnOd2rHjh1661vfqhdffFH5fF7333+/hoaG9O1vf1vuri1btuib3/ymzjnnHH3ve9/T5z73OV1yySX6zd/8TX3mM5/RRz7yEX3qU5/SN77xDZ155pn60Y9+pI997GN64IEH1NLSottuu02f+tSn9Ad/8Ad6//vfr4ceekjr1q1Tb2/vkl/jqdAyDgAAgFDs2rVLW7dulSRt3bpVu3bt0gMPPKD3vve9am5uliStWrVKExMTOnz4sN761rdKKky209zcrPvvv1/333+/LrzwQm3cuFFPPfWUhoaGJElnn322LrnkEknSu971Lu3bt++k3//II4/oiSee0CWXXKINGzbonnvu0cGDB/XUU09p7dq16ujokJnpXe96V92OAS3jAAAAmFd5y3epRXw5reElR48e1UMPPaTBwUGZmWZmZmRmetvb3lb1c7i7brrpJn3gAx84Yfmzzz570rCDlYYhdHddeeWVJ9WrHzhwYBGvZHloGQcAAEDg7rvvPr373e/WwYMH9eyzz+q5557T2rVr9YpXvEKf//znZztZHj16VK2trTrrrLP0la98RZL00ksvaWpqSldffbXuuuuu2Trvw4cPa2xsTJL0/e9/X/v375ck/c3f/I02bdokSWptbdXExIQk6Y1vfKP+5V/+RcPDw5KkyclJPf300zr//PP17LPPztal17NzKck4AAAAArdr167ZspOSX/u1X9Pzzz+vLVu2qKurSxs2bNCf/umfSpK++MUv6vbbb9f69et18cUX6wc/+IGuuuoqveMd71B3d7c6Ozt13XXXzSbaP//zP6877rhDF1xwgV544QV96EMfkiTdcMMNuuaaa3TZZZepvb1dd999t97+9rdr/fr16u7u1lNPPaUVK1bozjvv1K/8yq9o48aNymazdTsO5u51e/Ko6erq8oGBgbDDAAAACN2TTz6pCy64IOww6uLZZ5/Vm9/8Zj3++ON1/12VjqOZPebuXdXsT804AMwjl5vQ2FifpqeH1NTUoWy2V5lMa9hhAQAaCMk4AFRw7Ng+DQ5ulnte+fykUqkWjYxsV2fnHrW1bQo7PADAAs4999xAWsVrgZpxAJgjl5vQ4OBmzcxMKJ+flCTl85OamSksz+WOhxwhAKBRkIwDwBxjY31yz1dc557X+HhfwBEBABoVZSoAMMf09NBsi/hc+fykpqaGA44ItUI/AABRQzIOAHM0NXUolWqpmJCnUi1qbl4XQlRYLvoBAIgiylQAYI5stldmld8ezVJqb+8NOCIsF/0AgOXL5SY0OrpTIyM3anR0p3K5iWU/Zzqd1oYNG/S6171Ov/qrv6pjx46dcp+LL754Sb/rK1/5ip544okl7VtPJOMAMEcm06rOzj1Kp1uVSrVIKrSIp9OF5ZnMypAjxGLRDwBYnmPH9mn//jUaHv49PffcJzQ8/Hvav3+Njh3bt6znbWpq0oEDB/T4449r1apVuuOOO065z8MPP7yk30UyDgAx0ta2Sd3do+ro+LTOPnuHOjo+re7uUcoZYop+AMDSBXVlqbu7W4cPH559/MlPflJveMMbtH79et1yyy2zy1euXHnKbb7whS9o/fr1ev3rX693v/vdevjhh7V79279/u//vjZs2DA7zX0UUDMOAPPIZFZq9eptYYeBGqAfALB01VxZWu575czMjB588EFt21Z4nvvvv19DQ0P69re/LXfXli1b9M1vflNvetObZveZb5szzjhDH/vYx/Twww/rzDPP1NGjR7Vq1Spt2bJFb37zm3XdddctK9ZaIxkHADS8bLZXIyPbK66jHwCwsHpeWZqentaGDRt0+PBhXXDBBbryyislFRLt+++/XxdeeKEk6fjx4xoaGjopGa+0zXe+8x297W1v05lnnilJWrVq1ZLjCwJlKgCAhkc/AGDpSleWKlnulaVSzfjBgwfl7rM14+6um266SQcOHNCBAwc0PDw822peUs02cUAyDgBIBPoBAEsTxAhTzc3Nuv322/Vnf/ZnyuVyuvrqq3XXXXfp+PFCPfrhw4c1NjZ2wj7zbXP55Zfr7/7u73TkyBFJ0tGjRyVJra2tmphY/ggwtUaZCgAgMegHACxe6crS3HH6zVI1vbJ04YUXav369dq1a5fe/e5368knn1R3d7ekQqfNL33pS8pmszIzSdJVV11VcZvXvva1uvnmm3XppZcqnU7rwgsv1N13362tW7fq/e9/v26//Xbdd999Ou+882oS93KZu4cdQ2C6urp8YGAg7DAAAABC9+STT+qCCy6oevtc7rjGx/s0NTWs5uZ1am/vDbzE68iRI9q4caMOHjwY6O9dSKXjaGaPuXtXNfvTMg4AAIBTCvvK0ujoqHp6evSRj3wktBjqgWQcAAAAkfeqV71KTz/9dNhh1BwdOAEAABIqSeXK9VCL40cyDgAAkEArVqzQkSNHSMiXyN115MgRrVixYlnP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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_data():\n",
    "    positive = data2[data2['Accepted'].isin([1])]\n",
    "    negative = data2[data2['Accepted'].isin([0])]\n",
    "\n",
    "    fig, ax = plt.subplots(figsize=(12,8))\n",
    "    ax.scatter(x = positive['Microchip 1'],y = positive['Microchip 2'],c = 'black', s = 50,marker = '+',label = 'Accepted')\n",
    "    ax.scatter(x = negative['Microchip 1'],y = negative['Microchip 2'],c = 'y', s = 50,marker = 'o',label = 'Reject')\n",
    "    ax.legend()\n",
    "    ax.set_xlabel('Microchip 1')\n",
    "    ax.set_ylabel('Microchip 2')\n",
    "#     plt.show()\n",
    "plot_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sigmoid(z):\n",
    "    return 1 / (1 + np.exp(-z))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [],
   "source": [
    "def feature_mapping(x1, x2, power,as_ndarray = False):\n",
    "    data = {}\n",
    "#     for i in np.arange(power + 1):\n",
    "#         for p in np.arange(i + 1):\n",
    "#             data[\"f{}{}\".format(i - p, p)] = np.power(x1, i-p)* np.power(x2,p)\n",
    "    data = {\"f'{}{}\".format( i-p , p ):np.power(x1,i-p) * np.power(x2,p)\n",
    "                    for i in np.arange(power+1)\n",
    "                    for p in np.arange(i+1)\n",
    "           }\n",
    "    if as_ndarray:\n",
    "        return np.array(pd.DataFrame(data))\n",
    "    else:\n",
    "        return pd.DataFrame(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(118, 28)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>f'00</th>\n",
       "      <th>f'10</th>\n",
       "      <th>f'01</th>\n",
       "      <th>f'20</th>\n",
       "      <th>f'11</th>\n",
       "      <th>f'02</th>\n",
       "      <th>f'30</th>\n",
       "      <th>f'21</th>\n",
       "      <th>f'12</th>\n",
       "      <th>f'03</th>\n",
       "      <th>...</th>\n",
       "      <th>f'23</th>\n",
       "      <th>f'14</th>\n",
       "      <th>f'05</th>\n",
       "      <th>f'60</th>\n",
       "      <th>f'51</th>\n",
       "      <th>f'42</th>\n",
       "      <th>f'33</th>\n",
       "      <th>f'24</th>\n",
       "      <th>f'15</th>\n",
       "      <th>f'06</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.051267</td>\n",
       "      <td>0.69956</td>\n",
       "      <td>0.002628</td>\n",
       "      <td>0.035864</td>\n",
       "      <td>0.489384</td>\n",
       "      <td>0.000135</td>\n",
       "      <td>0.001839</td>\n",
       "      <td>0.025089</td>\n",
       "      <td>0.342354</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000900</td>\n",
       "      <td>0.012278</td>\n",
       "      <td>0.167542</td>\n",
       "      <td>1.815630e-08</td>\n",
       "      <td>2.477505e-07</td>\n",
       "      <td>0.000003</td>\n",
       "      <td>0.000046</td>\n",
       "      <td>0.000629</td>\n",
       "      <td>0.008589</td>\n",
       "      <td>0.117206</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.092742</td>\n",
       "      <td>0.68494</td>\n",
       "      <td>0.008601</td>\n",
       "      <td>-0.063523</td>\n",
       "      <td>0.469143</td>\n",
       "      <td>-0.000798</td>\n",
       "      <td>0.005891</td>\n",
       "      <td>-0.043509</td>\n",
       "      <td>0.321335</td>\n",
       "      <td>...</td>\n",
       "      <td>0.002764</td>\n",
       "      <td>-0.020412</td>\n",
       "      <td>0.150752</td>\n",
       "      <td>6.362953e-07</td>\n",
       "      <td>-4.699318e-06</td>\n",
       "      <td>0.000035</td>\n",
       "      <td>-0.000256</td>\n",
       "      <td>0.001893</td>\n",
       "      <td>-0.013981</td>\n",
       "      <td>0.103256</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.213710</td>\n",
       "      <td>0.69225</td>\n",
       "      <td>0.045672</td>\n",
       "      <td>-0.147941</td>\n",
       "      <td>0.479210</td>\n",
       "      <td>-0.009761</td>\n",
       "      <td>0.031616</td>\n",
       "      <td>-0.102412</td>\n",
       "      <td>0.331733</td>\n",
       "      <td>...</td>\n",
       "      <td>0.015151</td>\n",
       "      <td>-0.049077</td>\n",
       "      <td>0.158970</td>\n",
       "      <td>9.526844e-05</td>\n",
       "      <td>-3.085938e-04</td>\n",
       "      <td>0.001000</td>\n",
       "      <td>-0.003238</td>\n",
       "      <td>0.010488</td>\n",
       "      <td>-0.033973</td>\n",
       "      <td>0.110047</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.375000</td>\n",
       "      <td>0.50219</td>\n",
       "      <td>0.140625</td>\n",
       "      <td>-0.188321</td>\n",
       "      <td>0.252195</td>\n",
       "      <td>-0.052734</td>\n",
       "      <td>0.070620</td>\n",
       "      <td>-0.094573</td>\n",
       "      <td>0.126650</td>\n",
       "      <td>...</td>\n",
       "      <td>0.017810</td>\n",
       "      <td>-0.023851</td>\n",
       "      <td>0.031940</td>\n",
       "      <td>2.780914e-03</td>\n",
       "      <td>-3.724126e-03</td>\n",
       "      <td>0.004987</td>\n",
       "      <td>-0.006679</td>\n",
       "      <td>0.008944</td>\n",
       "      <td>-0.011978</td>\n",
       "      <td>0.016040</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.513250</td>\n",
       "      <td>0.46564</td>\n",
       "      <td>0.263426</td>\n",
       "      <td>-0.238990</td>\n",
       "      <td>0.216821</td>\n",
       "      <td>-0.135203</td>\n",
       "      <td>0.122661</td>\n",
       "      <td>-0.111283</td>\n",
       "      <td>0.100960</td>\n",
       "      <td>...</td>\n",
       "      <td>0.026596</td>\n",
       "      <td>-0.024128</td>\n",
       "      <td>0.021890</td>\n",
       "      <td>1.827990e-02</td>\n",
       "      <td>-1.658422e-02</td>\n",
       "      <td>0.015046</td>\n",
       "      <td>-0.013650</td>\n",
       "      <td>0.012384</td>\n",
       "      <td>-0.011235</td>\n",
       "      <td>0.010193</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 28 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   f'00      f'10     f'01      f'20      f'11      f'02      f'30      f'21  \\\n",
       "0   1.0  0.051267  0.69956  0.002628  0.035864  0.489384  0.000135  0.001839   \n",
       "1   1.0 -0.092742  0.68494  0.008601 -0.063523  0.469143 -0.000798  0.005891   \n",
       "2   1.0 -0.213710  0.69225  0.045672 -0.147941  0.479210 -0.009761  0.031616   \n",
       "3   1.0 -0.375000  0.50219  0.140625 -0.188321  0.252195 -0.052734  0.070620   \n",
       "4   1.0 -0.513250  0.46564  0.263426 -0.238990  0.216821 -0.135203  0.122661   \n",
       "\n",
       "       f'12      f'03  ...      f'23      f'14      f'05          f'60  \\\n",
       "0  0.025089  0.342354  ...  0.000900  0.012278  0.167542  1.815630e-08   \n",
       "1 -0.043509  0.321335  ...  0.002764 -0.020412  0.150752  6.362953e-07   \n",
       "2 -0.102412  0.331733  ...  0.015151 -0.049077  0.158970  9.526844e-05   \n",
       "3 -0.094573  0.126650  ...  0.017810 -0.023851  0.031940  2.780914e-03   \n",
       "4 -0.111283  0.100960  ...  0.026596 -0.024128  0.021890  1.827990e-02   \n",
       "\n",
       "           f'51      f'42      f'33      f'24      f'15      f'06  \n",
       "0  2.477505e-07  0.000003  0.000046  0.000629  0.008589  0.117206  \n",
       "1 -4.699318e-06  0.000035 -0.000256  0.001893 -0.013981  0.103256  \n",
       "2 -3.085938e-04  0.001000 -0.003238  0.010488 -0.033973  0.110047  \n",
       "3 -3.724126e-03  0.004987 -0.006679  0.008944 -0.011978  0.016040  \n",
       "4 -1.658422e-02  0.015046 -0.013650  0.012384 -0.011235  0.010193  \n",
       "\n",
       "[5 rows x 28 columns]"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x1 = np.array(data2['Microchip 1'])\n",
    "x2 = np.array(data2['Microchip 2'])\n",
    "\n",
    "_data2 = feature_mapping(x1, x2, power = 6)\n",
    "print(_data2.shape)\n",
    "_data2.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(118, 28)\n",
      "(118,)\n"
     ]
    }
   ],
   "source": [
    "theta = np.zeros(_data2.shape[1])\n",
    "X = feature_mapping(x1, x2, power = 6,as_ndarray = True)\n",
    "print(X.shape)\n",
    "\n",
    "y = np.array(data2.iloc[:,-1])\n",
    "print(y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6931471805599454"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def regularized_cost(theta, X, y, l=1):\n",
    "    thetaReg = theta[1:]\n",
    "    first = ( -y * np.log(sigmoid(X @ theta) ))  - (1-y) * np.log(1-sigmoid( X @ theta ))\n",
    "    reg = (thetaReg @ thetaReg) * l / ( 2*len(X) )\n",
    "    return np.mean(first) + reg\n",
    "\n",
    "regularized_cost(theta,X,y,l=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0])"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def regularized_gradient(theta, X, y, l=1):\n",
    "    thetaReg = theta[1:]\n",
    "    first = ( X.T @ (sigmoid(X @ theta) - y)) / len(X)\n",
    "#     print(first)\n",
    "     # 这里人为插入一维0，使得对theta_0不惩罚，方便计算\n",
    "    reg = np.concatenate([np.array([0]), (l / len(X)) * thetaReg])\n",
    "#     print(reg)\n",
    "# [8.47457627e-03 1.87880932e-02 7.77711864e-05 5.03446395e-02\n",
    "#  1.15013308e-02 3.76648474e-02 1.83559872e-02 7.32393391e-03\n",
    "#  8.19244468e-03 2.34764889e-02 3.93486234e-02 2.23923907e-03\n",
    "#  1.28600503e-02 3.09593720e-03 3.93028171e-02 1.99707467e-02\n",
    "#  4.32983232e-03 3.38643902e-03 5.83822078e-03 4.47629067e-03\n",
    "#  3.10079849e-02 3.10312442e-02 1.09740238e-03 6.31570797e-03\n",
    "#  4.08503006e-04 7.26504316e-03 1.37646175e-03 3.87936363e-02]\n",
    "# [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
    "#  0. 0. 0. 0.]\n",
    "    return first + reg\n",
    "np.array([0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([8.47457627e-03, 1.87880932e-02, 7.77711864e-05, 5.03446395e-02,\n",
       "       1.15013308e-02, 3.76648474e-02, 1.83559872e-02, 7.32393391e-03,\n",
       "       8.19244468e-03, 2.34764889e-02, 3.93486234e-02, 2.23923907e-03,\n",
       "       1.28600503e-02, 3.09593720e-03, 3.93028171e-02, 1.99707467e-02,\n",
       "       4.32983232e-03, 3.38643902e-03, 5.83822078e-03, 4.47629067e-03,\n",
       "       3.10079849e-02, 3.10312442e-02, 1.09740238e-03, 6.31570797e-03,\n",
       "       4.08503006e-04, 7.26504316e-03, 1.37646175e-03, 3.87936363e-02])"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "regularized_gradient(theta,X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "init cost = 0.6931471805599454\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "     fun: 0.5290027310062123\n",
       "     jac: array([-2.94458943e-07, -1.51972320e-06,  2.34238009e-06,  1.85223250e-06,\n",
       "       -2.39375675e-06,  4.28895410e-06, -1.35435949e-06,  1.53200325e-06,\n",
       "       -1.93764599e-07,  7.98286895e-07, -1.50233067e-07, -1.50619590e-06,\n",
       "        4.86214170e-07, -9.80408224e-07,  1.85534606e-06, -1.27800966e-06,\n",
       "        7.29815957e-07, -6.57848811e-07,  3.56959000e-07, -2.89443654e-08,\n",
       "       -2.66044823e-07, -8.48670056e-07, -7.48056830e-07,  1.26070965e-07,\n",
       "       -6.66924636e-07,  2.79434662e-07, -6.00948390e-07,  2.20284467e-07])\n",
       " message: 'Optimization terminated successfully.'\n",
       "    nfev: 55\n",
       "     nit: 19\n",
       "    njev: 55\n",
       "  status: 0\n",
       " success: True\n",
       "       x: array([ 1.2726322 ,  0.62526851,  1.18110054, -2.01977776, -0.91750968,\n",
       "       -1.43140105,  0.12396937, -0.36542089, -0.35720349, -0.17516017,\n",
       "       -1.45817405, -0.05109747, -0.61556197, -0.2747374 , -1.19275643,\n",
       "       -0.24225813, -0.20594332, -0.0447863 , -0.27777193, -0.29534672,\n",
       "       -0.45647333, -1.04328679,  0.02771439, -0.29243876,  0.01551392,\n",
       "       -0.3273817 , -0.14391016, -0.92473298])"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import scipy.optimize as opt\n",
    "print('init cost = {}'.format(regularized_cost(theta,X,y)))\n",
    "#init cost = 0.6931471805599454\n",
    "res = opt.minimize(fun=regularized_cost,x0=theta,args=(X,y),method='CG',jac=regularized_gradient)\n",
    "res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "init cost = 0.6931471805599454\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "     fun: 0.5290027297130991\n",
       "     jac: array([-3.43864518e-07, -2.44768778e-09, -9.43718424e-08,  7.79836255e-09,\n",
       "        1.87847362e-08, -1.48243025e-07,  7.23008737e-09, -2.07295216e-08,\n",
       "        1.45885028e-08, -5.96590490e-08,  4.78174025e-08,  7.02570207e-09,\n",
       "        1.74520455e-09,  9.87022512e-09, -3.85778677e-08,  5.16654199e-09,\n",
       "       -8.00106929e-09,  4.79794277e-09, -4.24227921e-09, -2.47789316e-10,\n",
       "       -5.50094539e-08,  6.58565485e-09,  1.99445696e-09,  3.68875163e-09,\n",
       "        4.99319365e-09,  1.05388850e-09,  7.68837046e-09, -2.57083894e-08])\n",
       " message: 'Optimization terminated successfully.'\n",
       "    nfev: 7\n",
       "    nhev: 0\n",
       "     nit: 6\n",
       "    njev: 70\n",
       "  status: 0\n",
       " success: True\n",
       "       x: array([ 1.27273835,  0.62527067,  1.18108852, -2.0199575 , -0.91742314,\n",
       "       -1.43166641,  0.12400638, -0.36553539, -0.35723822, -0.17513013,\n",
       "       -1.45815177, -0.0509885 , -0.61555352, -0.27470598, -1.19281307,\n",
       "       -0.24218856, -0.20600664, -0.04473034, -0.27778426, -0.29537844,\n",
       "       -0.45635885, -1.0432029 ,  0.02777191, -0.29243071,  0.01556724,\n",
       "       -0.32737879, -0.14388658, -0.92465056])"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import scipy.optimize as opt\n",
    "print('init cost = {}'.format(regularized_cost(theta,X,y)))\n",
    "#init cost = 0.6931471805599454\n",
    "res = opt.minimize(fun=regularized_cost,x0=theta,args=(X,y),method='Newton-CG',jac=regularized_gradient)\n",
    "res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict(theta, X):\n",
    "    probability = sigmoid( X @ theta)\n",
    "    return [1 if x >= 0.5 else 0 for x in probability]  # return a list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.90      0.75      0.82        60\n",
      "           1       0.78      0.91      0.84        58\n",
      "\n",
      "    accuracy                           0.83       118\n",
      "   macro avg       0.84      0.83      0.83       118\n",
      "weighted avg       0.84      0.83      0.83       118\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "\n",
    "final_theta = res.x\n",
    "y_predict = predict(final_theta, X)\n",
    "predict(final_theta, X)\n",
    "print(classification_report(y,y_predict))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-0.8, 1.2)"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAucAAAHjCAYAAACAfrFDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3XtclGX+//HXNYAKiKIChaJ5NksUDS3SX+KW5pqabbWa1Wb53bayWnMtbWtzv522c7t917aTdnA3czush3I7aGFLYaVpkXYQTFPRwAOFgIdhrt8fHBYNEGFm7hvm/Xw85gFzz8x9v3EEP158rusy1lpERERERMR5HqcDiIiIiIhIORXnIiIiIiIuoeJcRERERMQlVJyLiIiIiLiEinMREREREZdQcS4iIiIi4hIqzkVEREREXELFuYiIiIiIS6g4FxERERFxiXCnAwRTXFyc7dq1q9MxRERERKQZW7t27W5rbXxDXhtSxXnXrl1Zs2aN0zFEREREpBkzxmxt6GvV1iIiIiIi4hIqzkVEREREXELFuYiIiIiIS4RUz7mIiIiIlDt8+DDbt2/nwIEDTkdpslq1akVSUhIRERF+O6eKcxEREZEQtH37dmJiYujatSvGGKfjNDnWWvbs2cP27dvp1q2b386rthYRERGREHTgwAE6dOigwryBjDF06NDB7795UHEuIiIiEqJUmDdOIP78VJyLiIiIiLiEinMRERERqZf09HTS09P9es7FixdjjOGrr77y63lr8+c//5mSkpLjek1GRgZjx44NUKIjqTgXEREREccsXLiQYcOGsXDhwqBcryHFeTCpOBcRERERR+zfv5/MzEzmzZvHSy+9VHX8/vvvJzk5mQEDBjB79mwAcnJyOOeccxgwYACDBg0iNzcXgAcffJDBgwfTv39/5syZA8CWLVs4+eSTufTSS+nbty8XXXQRJSUlPPbYY+Tl5TFixAhGjBgBwNtvv01aWhqDBg3i4osvZv/+/QC8+eabnHzyyQwaNIjXXnstaH8mWkpRRERERGpVvY1l1apVPzmWkZHR4HMvWbKE0aNH07t3bzp06MDatWvJz89nyZIlfPTRR0RFRbF3714ALr30UmbPns0FF1zAgQMH8Pl8vP3222zatImPP/4Yay3jx4/n/fffp0uXLnz99dfMmzePoUOHctVVV/H4448zc+ZMHnnkEd577z3i4uLYvXs3d999NytWrCA6Opr777+fRx55hFtuuYVf//rXvPvuu/Ts2ZOJEyc2+Gs8Xho5FxERERFHLFy4kEmTJgEwadIkFi5cyIoVK7jyyiuJiooCoH379hQVFbFjxw4uuOACoHzzn6ioKN5++23efvttBg4cyKBBg/jqq6/YtGkTAJ07d2bo0KEAXHbZZWRmZv7k+qtXr2bjxo0MHTqUlJQUnn/+ebZu3cpXX31Ft27d6NWrF8YYLrvssmD8cQAaORcRERGROlQfGa8cMW/MaHmlvXv38u6775KdnY0xhrKyMowxXHzxxfU+h7WWW2+9ld/85jdHHN+yZctPljmsadlDay0jR478Sb/7+vXrj+Mr8S+NnItIk+T1FpGX9wy5ubPIy3sGr7fI6UgiInIcXnnlFS6//HK2bt3Kli1b2LZtG926daNt27Y8++yzVZM29+7dS0xMDElJSSxevBiAgwcPUlJSwrnnnsv8+fOr+sR37NhBfn4+AN999x1ZWVkAvPjiiwwbNgyAmJgYiorK/80444wz+OCDD8jJyQGguLiYb775hpNPPpktW7ZU9bUHa7IqqDgXkSaosDCTrKxO5ORMZ9u2B8jJmU5WVicKC3/6K0sREXGnhQsXVrWpVLrwwgvZuXMn48ePJzU1lZSUFB566CEAFixYwGOPPUb//v0588wz2bVrF6NGjWLy5MmkpaWRnJzMRRddVFV49+nTh7lz59K3b1/27dvHtddeC8DVV1/N6NGjGTFiBPHx8Tz33HNccskl9O/fn7S0NL766itatWrFU089xXnnncegQYNISEgI2p+LsdYG7WJOS01NtWvWrHE6hog0gtdbRFZWJ8rKfjpSHhYWQ1paHuHhrR1IJiLStHz55Zf07dvX6RgBsWXLFsaOHcsXX3wR8GvV9OdojFlrrU1tyPk0ci4iTUp+/iKs9dX4mLU+CgoWBTmRiIiI/2hCqIg0KaWlm/D5imt8zOcrpqQkJ8iJxOstIj9/EaWlm4iM7EVCwkTCw2OcjiUiIaxr165BGTUPBBXnItKkREb2wuOJrrFA93iiiYrq6UCq0FVYmEl29his9eHzFePxRJObO4Pk5OXExg5zOp6ISJOjthYRaVISEiZiTM0/uozxEB8fvI0iQp3XW0R29hjKyoqq/rPk8xVTVlZ+3Ovd73BCEZGmR8W5iDQp4eExJCcvJywsBo8nGigfMQ8LKz+uyaDBo/5/ERH/U1uLiDQ5sbHDSEvLo6BgESUlOURF9SQ+fqIK8yBT/7+IiP+pOBeRJik8vDWJiVOdjhHS1P8vEloCMfk7LCyM5ORkvF4v3bp1Y8GCBcTGxtb5mjPPPJMPP/zwuK+1ePFievfuzSmnnNLQuEGhthYREWkQ9f+LhI5Abf4WGRnJ+vXr+eKLL2jfvj1z58495msaUphDeXG+cePGBr02mFSci4hIg6j/XyQ0BGvyd1paGjt27Ki6/+CDDzJ48GD69+/PnDlzqo63bt36mM954YUX6N+/PwMGDODyyy/nww8/ZOnSpdx8882kpKSQm5vrl8yBoLYWERFpMPX/izR/9Zn83dg2w7KyMlauXMnUqeXnefvtt9m0aRMff/wx1lrGjx/P+++/z1lnnVX1mtqe06FDB+6++24+/PBD4uLi2Lt3L+3bt2f8+PGMHTuWiy66qFFZA03FuYiINIr6/0Wat0BO/i4tLSUlJYUdO3bQt29fRo4cCZQX3m+//TYDBw4EYP/+/WzatOknxXlNz/nss8+4+OKLiYuLA6B9+/YNzucEtbWIiIiISK0qJ3/XpLGTvyt7zrdu3Yq1tqrn3FrLrbfeyvr161m/fj05OTlVo+qV6vOcpkjFuYiIiIjUKhiTv6Oionjsscd4+OGH8Xq9nHvuucyfP5/9+8v72Xfs2EF+fv4Rr6ntOT/72c94+eWX2bNnDwB79+4FICYmhqKiokZnDTQV5yIiIiJSq2BN/h44cCD9+/dn4cKFjBo1ismTJ5OWlkZycjIXXXRRVWFtjAGo9Tmnnnoqt912G8OHD2fAgAHMmDEDgEmTJvHggw8ycOBAV08INdZapzMETWpqql2zZo3TMUREREQc9+WXX9K3b996P9/r3e/45O89e/YwaNAgtm7dGtTr1qWmP0djzFprbWpDzqcJoSIiIiJyTE5P/s7LyyM9PZ2ZM2c6liEYVJyLiIiIiOt17NiRb775xukYAaeecxEREZEQFUrtzYEQiD8/FeciIiIiIahVq1bs2bNHBXoDWWvZs2cPrVq18ut51dYiIiIiEoKSkpLYvn07BQUFTkdpslq1akVSUpJfz6niXERERCQERURE0K1bN6djyFEcbWsxxsw3xuQbY76o5XFjjHnMGJNjjPncGDOo2mNXGGM2VdyuCF5qaa683iLy8p4hN3cWeXnP4PW6f6MC8R+9/yIi4gZOj5w/B/wVeKGWx38O9Kq4nQ78DTjdGNMemAOkAhZYa4xZaq3dF/DE0iwVFmaSnT0Ga334fMV4PNHk5s4gOXk5sbHDnI4X0rzeIvLzF1FauonIyF4kJEwkPDzGr9fQ+y8iIm7h6Mi5tfZ9YG8dTzkfeMGWWw3EGmMSgXOBd6y1eysK8neA0YFPLM2R11tEdvYYysqK8PmKAfD5iikrKz/u9e53OGHoKizMJCurEzk509m27QFycqaTldWJwsJMv11D77+IiLiJ21dr6QRsq3Z/e8Wx2o7/hDHmamPMGmPMGk14kJrk5y/CWl+Nj1nro6BgUZATCQSvaNb7LyIibuL24rzRrLVPWWtTrbWp8fHxTscRFyot3VRV/B3N5yumpCQnyIkEglc06/0XERE3cXtxvgPoXO1+UsWx2o6LHLfIyF54PNE1PubxRBMV1TPIiQSCVzTr/RcRETdxe3G+FPhVxaotZwA/WGt3Am8Bo4wx7Ywx7YBRFcdEjltCwkSMqflbwRgP8fETg5xIIHhFs95/ERFxE6eXUlwIZAF9jDHbjTFTjTHXGGOuqXjKcmAzkAM8DVwHYK3dC9wFfFJxu7PimMhxCw+PITl5OWFhMVXFoMcTTVhY+fHw8NYOJwxNwSqa9f6LiIibmFDasjU1NdWuWbPG6RjiUl7vfgoKFlFSkkNUVE/i4yc268IsPT0dgIyMDEdz1KWmJQ6N8QRkicNQe/9FRCRwjDFrrbWpDXmt0+uci7hGeHhrEhOnOh1DqomNHUZaWl5Qima9/yIi4gYqzkXE1VQ0i4hIKFFxLhJCKltZAFatWvWTY25ucREREQkFbl+tRUREREQkZGjkXCSEVB8ZbwoTQkVEREKNinMRkWbG6y0iP38RpaWbiIzsRULCRMLDY5yOJSIi9aDiXESkGalp+cnc3BkBWX5SRET8T8W5SIhSO0vz4/UWkZ09hrKyoqpjPl8xANnZY0hLy9Pa7SIiLqfiXMQhaj1ofpx+T/PzF2Gtr8bHrPVRULBIy1KKiLicinMRB6j1oPlxw3taWrqpaqT8aD5fMSUlOUHJISIiDaelFEWCrHrrQWUh5fMVU1ZWftzr3e9wQjlebnlPIyN74fFE1/iYxxNNVFTPoOQQEZGGU3EuIcfrLSIv7xlyc2eRl/cMXm/RsV/kR/VpPZCmxS3vaULCRIyp+ce6MR7i4ycGJYeIiDSc2lokpKj1QALBLe9peHgMycnLf/J33BgPycnLNRlURKQJUHEuIcMtK1lUth7UVMyp9aBpctN7Ghs7jLS0PAoKFlFSkkNUVE/i4yeqMBcRaSLU1iIhQ60HEihue0/Dw1uTmDiVHj3+RGLiVBXmzZTTLXoiEhgaOZeQodYDCRS9pxJsbmjRE5HAUHEuIUOtBxJIek8lWNzSoicigaHiXEJGQsJEcnNn1PiYk60HTV1paSl79+5l79697Nmzh3379lFSUkJpaelPPtZ0rPLjoUOHsNbi8/mw1h7z5vOVtyiFh4fTsmVLWrRoQcuWLX/yeU2PtWrVijZt2hzz1qJFi+P6s2gu76m4mzabEmneVJxLyFDrQf15vV6+++47duzYwffff8+uXbuO+Fj5eUFBAaWlpfU6Z6tWrYiKiiIyMrLqY+XnlYWwx+PBGHPMW+XzKrMeOnSIgwcPVt2Ki4vZu3dv1f2jHz9w4ADW2mNmbtmyJW3btiU2NpZ27doRFxdHx44dq26JiYlVnyckJBAWFtaoP3eR+nBLi56IBIaKcwkpaj34rwMHDvDtt9+Sk5NDbm4uOTk5VbetW7fi9XqPeL7H4yE+Pp4TTzyRE044gT59+pCQkECHDh3o0KED7du3p0OHDsTGxhIdHX1EId6yZUs8HvfMP7fWUlpayo8//njMW2FhIfv27WPfvn3s2LGDNWvWkJ+f/5Pi3uPxcOKJJx5RsFfeunTpQvfu3enSpctxj8aLHM1NLXoi4n+mPqNHzUVqaqpds2aN0zFEgqasrIxNmzaxYcOGnxTh27dvP6LAbNu2LT179qy69ejRg6SkpKpivEOHDhoZrnD48GG+//578vLy2LlzJ3l5eVW36vcLCgqOeJ3H4yEpKYnu3bvTrVu3Iz52796dhISEqt8IiNTG6y0iK6vTET3nlcLCYtRzLuICxpi11trUhrxWI+cizcShQ4fYsGEDn376KevWrePTTz/ls88+o6SkpOo58fHx9OzZk/T09KoCvLIYb9++vQrDeoqIiCApKYmkpKQ6n3fo0CF27drF1q1b2bx5M5s3b+bbb79l8+bNvPnmm+zcufOI50dFRdGtW7eqgv3kk0+mb9++9O3bV4W7VFGLnkjzppFzkSaouLiYzz777IhCfMOGDRw+fBiAmJgYUlJSGDhwIIMGDSI5OZmePXvSpk0bh5NLdaWlpWzZsqWqYK9evOfm5lJc/N+2hXbt2nHKKadUFeuVty5duriqZUiCx+vdrxY9EZdqzMi5inMRl7PW8vXXX5ORkcF//vMfPv30U77++uuqlpS4uDgGDRpUVYgPHDiQHj16qGBr4qy1bN++nS+//JIvv/ySjRs3Vn2+e/fuqudFRUXRp0+fqmL91FNPJSUlha5du2qkXUTEISrO60nFuTQF1lq++eYbMjIyqm67du0CoGPHjgwePPiIQrxTp04qwkLM7t27qwr16sX7tm3bqp7Ttm1bUlJSqn6DkpKSQt++fTUhVUQkCFSc15OKc3Ejay05OTm89957VcV4ZS9yx44dGTFiBOnp6aSnp9OjRw8V4lKr/fv3s2HDBtavX8+6detYv349n3/+edVyly1atKgaWa8s2vv370/btm0dTi4i0ryoOK8nFefiFt9++y0rV66sKsjz8vIAOPHEE6uK8REjRtCzZ08V49IoZWVlfPPNN6xfv77qtm7duiNWkunevTupqamcccYZnH766QwaNIhWrVo5mFpEpGlTcV5PKs7FKdZa1q9fz+LFi/nXv/5FdnY2ACeccMIRI+O9e/dWMS4BZ61l586dVcX6p59+yieffMJ3330HlO+6mpKSwumnn15VsOs/iiIi9afivJ5UnEswlZWVkZmZyeLFi1m8eDFbtmzB4/EwbNgwJkyYwOjRozn55JNV8Ihr7Ny5k48++oiPPvqI1atX88knn1StGNOhQweGDBlSVawPGTKEdu3aOZxYRMSdVJzXk4pzCYaNGzfy5JNP8uKLL7J7925atmzJyJEjueCCCxg3bhzx8fFORxSpl7KyMjZu3Mjq1aurivYNGzZUrRR08skn8/Of/5xx48YxbNgwIiIigpbN6y0iP38RpaWbiIzsRULCRMLDY4J2fRGRuqg4rycV5xIoBw4c4JVXXuHJJ58kMzOTiIgILrjgAi6++GJGjx5N69Zae9gp6enpAGRkZDiao7n48ccfWbNmDR999BGrVq3ivffe49ChQ8TGxjJ69GjGjRvHz3/+84COqhcWZta6AU9s7LCAXVdEpL5UnNeTinPxt82bNzN37lyee+459u7dS8+ePbn66quZMmWKRshdQsV5YO3fv5933nmHZcuW8cYbb5Cfn09YWBjDhg1j3LhxjBs3jt69e/vtetq6XkSagsYU59qlRKQBvvnmG6644gp69+7NY489xtlnn82KFSv4+uuvufnmm1WYS8ho3bo1F1xwAfPnz2fnzp1kZWUxa9Ys9u7dy8yZM+nTpw99+vTh5ptv5v3338fr9Tbqevn5i7DWV+Nj1vooKFjUqPOLiDhNI+cix2Hjxo3cfffdLFq0iJYtW3LNNdcwc+ZMOnbs6HQ0Vwv26HXl9QBWrVoFwPDhw6uOaRQ9OLZs2cKyZctYtmwZGRkZHD58mHbt2jF27Fguuugizj33XFq2bHlc58zNncW2bQ/U+njnzrPp0eNPjY0uItIoGjkXCbDPP/+cX/7yl/Tr14+lS5cyc+ZMtmzZwiOPPKLCXKQWXbt25YYbbuDtt99m9+7dvPzyy4wbN47XX3+d888/n4SEBC6//HKWLVvGwYMH63XOyMheeDzRNT7m8UQTFdXTn1+CiEjQaeRcpA6ffvopd911F4sXLyYmJoYbbriBm266ibi4OKejNSlO9n2r59x9Dh06xLvvvss///lPFi9ezL59+2jTpg3nn38+F198MaNGjap1RF095yLSFGhCaD2pOJf6+vjjj7nrrrt4/fXXadu2LdOnT+fGG2+kffv2TkdrMtzSWqLi3N0aUqhrtRYRcbvGFOfh/g4j0pR9+OGH3Hnnnbz11lu0a9eOu+66ixtuuIG2bds6HU2kWWrRogWjR49m9OjRPPHEE0cU6gsWLDiiUD/33HNp0aIFsbHDSEvLo6BgESUlOURF9SQ+fqJGzEWkWdDIuQjl7Su33HILK1euJC4ujpkzZ3LdddcRE9N0NzVx04ixm7K4iRs20nFDhpocOnSIlStX8vLLL1eNqLdv357JkyczZcoUBg0apN11RcS11NZSTyrO5Wi7d+/mtttu4+mnn6ZDhw7Mnj2ba665hujomiecNSVuKojdlMUt3NCa4YYM9XHo0CFWrFjBCy+8wOLFizl48CCnnnoqU6ZM4dJLLyUxMdHpiCIiR9BqLSIN8OKLL9K7d2/mzZvHjTfeyKZNm/jd737XLApzcTevt4js7DGUlRXh8xUD4PMVU1ZWftzr3R8SGeqrRYsWjBkzhpdeeoldu3bxxBNP0KZNG26++WaSkpIYO3YsK1asIJQGm0Sk+dLIuYScAwcOcNNNN/HEE08wdOhQnnzySU499VSnY/mFWyZhSt3y8p4hJ2d6VVFcnccTTa9efyExcWqzz9BYX3/9NS+88ALz5s3j+++/p3///syYMYNJkyYd9/rpIiL+pJFzkXr69ttvGTp0KE888QS33HILGRkZzaYwl6ajtHRTjUUxlI9el5TkhESGxurTpw/33HMPW7du5dlnn8Vay5QpU+jatSv33HMPe/bscTqiiMhx02otEjKWLl3KFVdcAcCSJUsYP368w4n8r/rIuPq83atyI53aRq2DsZGOGzL4S8uWLZkyZQpXXHEFK1as4JFHHuH222/nnnvu4YorruCWW26hW7dujb6OWyfPikjzopFzafa8Xi+zZs3i/PPPp3v37nz66afNsjCXpiMhYSLG1Pzj1xgP8fETQyKDvxljGDlyJP/+97/54osvuPTSS5k/fz69e/dm6tSp5ObmNvjchYWZZGV1IidnOtu2PUBOznSysjpRWJjpx69ARETFuTRzeXl5/OxnP+OBBx7gmmuu4YMPPvDLCJpIY4SHx5CcvJywsJiqreg9nmjCwsqPB2O9bjdkCKRTTz2Vp59+ms2bNzNt2jRefPFF+vTpwxVXXME333xzXOdqSpNnRaTpc3RCqDFmNPAXIAx4xlp731GPPwqMqLgbBSRYa2MrHisDsise+85ae8yhUE0IDS3vvvsul1xyCfv37+fpp59m8uTJTkcSOYLXu9/xjXTckCEYdu3axYMPPsjf/vY3Dh48yCWXXMJtt91G3759j/na5jB5VkSCq0muc26MCQO+AUYC24FPgEustRtref4NwEBr7VUV9/dba4/rXxAV56HB5/Nx7733MmfOHPr06cMrr7zCKaec4nQsEXGB/Px8Hn74YebOnUtJSQm//OUvuf322+nXr1+tr8nNncW2bQ/U+njnzrPp0eNPgYgrIk1UU12tZQiQY63dbK09BLwEnF/H8y8BFgYlmTRZ+/fvZ/z48fzhD39g0qRJfPzxxyrMRaRKQkIC999/P1u2bGH27Nm88cYbJCcnc9FFF/HZZ5/V+JrKybM1aWqTZ0XE/ZwszjsB26rd315x7CeMMScB3YB3qx1uZYxZY4xZbYyZUNtFjDFXVzxvTUFBgT9yi0vl5+czYsQI3nzzTebOncvf//53Wrdufr+eF5HGi4uL495772Xr1q3cfvvtvPPOO6SkpHDBBRfw6aefHvFcpyfPer1F5OU9Q27uLPLynsHrLQro9UTEWU1lQugk4BVrbVm1YydV/LpgMvBnY0yPml5orX3KWptqrU2Nj48PRlZxwObNmxk6dCgbNmxg8eLFXHfddRhjnI4lIi7Xvn177rrrLrZs2cIf//hHMjIyOO200zj//PP58ssvAWcnz2qVGJHQ42RxvgPoXO1+UsWxmkziqJYWa+2Oio+bgQxgoP8jSlPw5ZdfMnToUPbs2cPKlSsZO3as05FEpIlp164dc+bMYcuWLdx5551kZGSQnJzMtGnT+OGHH4iNHUZaWh69ev2Fzp1n06vXX0hLyyM2dljAMmmVGJHQ5GRx/gnQyxjTzRjTgvICfOnRTzLGnAy0A7KqHWtnjGlZ8XkcMBSocSKpNG8FBQWcd955WGvJzMwkLS3N6Ugi0oS1bduWP/zhD+Tk5HDttdfyxBNPcOqpp/LGG28QHt6axMSp9OjxJxITpwZ8VZv8/EVY66vxMWt9FBQsCuj1RcQZjhXn1lovcD3wFvAl8E9r7QZjzJ3GmOrLIk4CXrJHLivTF1hjjPkMeA+4r7ZVXqT5OnjwIL/4xS/YuXMnS5cu1cRPEfGb+Ph4/u///o/Vq1cTGxvL2LFj+dWvfsXevXuDlqG0dFONyzdC+Qh6SUlO0LKISPCEO3lxa+1yYPlRx+446v4fa3jdh0ByQMOJq1lrueaaa8jMzGThwoUMGtSXvLxnXLmttrb8Fmm6Bg8ezNq1a7n33nu59957efvtt5k7dy4XXnhhwK9duUpMbeura5UYkebJ0U2Igk3rnDcfDzzwALNmzWLOnDlMn34O2dljsNaHz1eMxxONMR6Sk5cHtB+0PgoLM12bTUSOz2effcaVV17JunXruOiii/jrX//KCSecELDreb1FZGV1oqzsp6uzhIXFkJaW1yw3jBJpDprqOuciDbJkyRJmz57NL3/5S37/+5tcO2Eq1Cdzpaenk56e7nSMoAm1rzcUDRgwgI8++oh77723qpXuH//4B4Ea5HJylRgRcY6Kc2lS1q9fz6WXXkpqairPPfccu3e/7NoJU81xMpcKUGmM5vD3JyIigltvvZX169fTu3dvLrvsMsaPH8+OHbUtNtY4TqwSIyLOUnEuTcauXbsYP348sbGxLFmyhMjISFdPmHJzNhFpnL59+5KZmcmjjz7KypUrOeWUU3jmmWcCMooe7FViRMRZjk4IlabD6UmNpaWlTJgwgT179pCZmUliYiLg7glTbs4WKNVHRVetWvWTYxkZGX67hj/O1VjB+HrFvcLCwpg+fTrjxo3jf/7nf/j1r3/Na6+9xnPPPUdCQoLT8USkiVJxLsdU06TG3NwZQZvUaK1l6tSpfPTRR7z66qsMHPjf/aYSEiaSmzujxtcFY1vturg52/FQASqNEQp/f3r06MHKlSt5/PHHmTlzJgMGDODvf/87Z599ttPRRKQJUnEudao+qbFS5UhwdvaYoKwWcPfdd7Nw4ULuvfdefvGLXxx9OPWMAAAgAElEQVTxWOWEqdpWRHHy179uzhYo1QstN41wB0qofb1SO4/Hw/XXX89ZZ53FpEmTGDlyJLNmzeLOO+8kIiLC6Xgi0oSoOJc61WdSY2Li1IBd/9VXX+WOO+7g8ssvZ/bs2TU+p3LCVEHBIkpKcoiK6kl8/ERXFL9uzlZfbihAQ2H0tblyw9+fYF6/f//+fPLJJ9x0003cd999vPfee7z88st07tw5YNcUkeZFxbnUyclJjXv27OE3v/kNgwcP5qmnnsIYU+tzKydMuZGbs4mI/0VHR/PUU08xcuRI/ud//ofTTz+d119/nUGDBjkdTUSaABXnUicnJzXecccdFBYWMm/ePFq1ahWw60hg+HN00k2jr7VxWx5x3sUXX0zfvn0577zzOOuss3jppZcYO3as07FcxenFBkTcSDuESp2c2qFu8+bN9OnTh1//+tc8/vjjfj+/NF1uLc7FnWpqiRo+fHjVsWD8Pdq5cyfjxo1j3bp1/PnPf+aGG24I+DWbAu2gLM2ZdgiVgHFqh7r//d//JTw8nNtvvz0g5xcRCZbExERWrVrFuHHjuPHGG5k+fTplZWVOx3JUqO+gLFIXtbXIMQV7UuOGDRtYsGABM2fOpGPHjgG5hgReoEa4NWIux8MtLVHR0dG8+uqr3HzzzTz66KN8++23vPjii0RHRwc9ixs4vdiAiJupOJd6CeakxjvuuIPWrVsza9asoFxPRCQYwsLCeOSRR+jRowc33ngjZ511Fq+//nrVpmqB4Naebu2gLFI7tbWIq6xZs4bXXnuN3/3ud3To0MHpOCIifjdt2jSWLl3K119/zemnn052dnZArlNYmElWVidycqazbdsD5ORMJyurE4WFmQG53vGoXGygJs11B2WR+tKEUHGV0aNHs2bNGjZv3kybNm0cyaAJhw3nhsl3Ik3FunXrGDt2LEVFRbz++uucddZZfju3U5P568vt+UQaSxNCpVl4//33eeutt5g9e7ZjhbmISLAMHDiQjz76iKSkJEaPHs2KFSv8du769HQ7yanFBkSaAvWciytYa7ntttvo2LEj06ZNczqONJBbJt+JNBVJSUlkZGRwzjnnMHbsWF577TXGjBnT6PM2hZ7u5rCDskggqDgXV3jzzTfJzMzk8ccfJzIyMujX1/bwIv7h1gmIbpaQkMB7773Hueeey4QJE/jnP//JhAkTGnVOJzeQOx7aQVnkp9TWIq7w6KOP0rlzZ6ZO1Q9pkabKzRMQ3a5Dhw6sWLGCQYMGMXHiRP7zn/806nwJCRMxpuZ/4o3xEB8/sVHnF5HA0YRQcVxeXh6dO3fm97//PXfddZfTcdSOIdIAmuDnH3v37uXMM88kPz+fDz74gL59+zb4XNqBU8Q5mhAqTdqLL76Iz+fj8ssvdzqKiDSQ2ycgNhXt27fn3//+NxEREYwZM4Zdu3Y1+FyVPd29ev2Fzp1n06vXX0hLy1NhLuJy6jkXxy1YsIAhQ4bQu3dvp6OISAM1hQmITUW3bt144403GD58OGPHjiUjI4PWrRv2Wwf1dIs0PRo5F0d9/vnnfP7551Wj5unp6UdMxHRCRkaGWlpEjpM2lfGvlJQ+PP74Vaxb9ynnn38mBw7sczqSiASJinNx1IIFCwgPD2fSpElORxGRRtAERP+pnFjbrduz/Pa3lnffzeaXvzyBffsaN0lURJoGFefimLKyMl588UV+/vOfExcX53QcEWkEbSrjH15vEdnZYygrK8LnK2b8eJg8GZYtO8zs2efg9e53OqKIBJh6zsUx7777Lnl5ecTGxla1smiNcZGm61ibymglpGOraWLt1Knw/ffw1FOH6N//JqZNe9qhdCISDCrOxTELFiygbdu2dOjQwekoIuInmoDYODVNrPV44JZbYM8euOmm+ZxyymRGjBjhUEIRCTQV5+KI4uJiXnvtNSZPnsxTTz1VdVwjayI10/dGaKhtZ88WLeDuu6OYMSOWCy64gMzMTPr16+dQShEJJBXn4oh//etfFBcXa21zkWaueoua2taOLSFhIrm5M2p8rE2bMP797xUMG3Y2Y8aMYfXq1XTs2DHICUUk0DQhVByxePFiOnfuzNChQ52OIiLiGseaWNu9e1/eeOMN9u7dyyWXXILPV/PGTyLSdBlrrdMZgiY1NdWuWbPG6Rghz1pLYmIio0aN4oUXXnA6johr1TTqPHz48KpjTW3UWa059ef17q91Yi3As88+y1VXXcXjjz/Otdde62BSEamJMWattTa1Ia9VW4sE3ebNm/n+++81ai4iUotjTaydMmUKL774IrNmzWLcuHEkJSUFMZ2IBJKKcwm6Dz74AEDFuTRIKI2+Vv8aQ+nrlmMzxvDkk0/Sr18/rrvuOpYsWYIxxulYIuIH6jmXoPvggw9o27Ytp5xyitNRxGHp6elHtG5I85aRkaH/XPhR9+7dueuuu1i2bBmvvPKK03FExE9UnEvQffDBB6SlpeHx6K+fiEhj/Pa3v+W0007j+uuvZ+/evU7HERE/UFuLHMHrLSI/fxGlpZuIjOxFQsJEwsNj/Hb+ffv2sWHDBiZNmuS3c0rzp+X46v4a1fISusLDw5k3bx6nnXYaM2fOZP78+U5HEpFGUnEuVQoLM8nOHoO1Pny+YjyeaHJzZ5CcvJzY2GF+uUZWVhagfvNQpkJbxL8GDBjALbfcwp/+9CcmT57MOeec43QkEWkEFecClI+YZ2ePoaysqOpY5Q512dljSEvLO2IZr4b64IMPCAsLY8iQIY0+l4QOTYwUqdsf/vAHXnnlFX7zm9+QnZ1NVFSU05FEpIFUnAsA+fmLsLbmzSys9VFQsKjOZb3q64MPPmDgwIFER0c3+lzSNKnQ9g9//gZC70PTFxkZydNPP016ejpz5szhwQcfdDqSiDSQZuQJAKWlm6pGyo/m8xVTUpLT6GscPnyYjz/+WC0tIiIBMHz4cK6++moeeeQR1q5d63QcEWkgjZwLAJGRvfB4omss0D2eaKKiejb6Ghs3bqS0tJS0tLRGn0tCl0Z3y+k3EFKT+++/n2XLlnHdddexevVqrX0u0gSpOBcAEhImkps7o8bHjPEQHz+x0df49ttvAejZs/GFvjQPKiado4m5zVNsbCz33HMPV111Fa+88goXX3yx05FE5DiprUUACA+PITl5OWFhMXg85f3gHk80YWHlx/0xGfS7774DoEuXLo0+l4iI1OxXv/oV/fr14/e//z2HDh1yOo6IHCeNnEuV2NhhpKXlUVCwiJKSHKKiehIfP9EvhTmUF+eRkZHExcX55XzNhVoSpLEa8ndHbTHNV1hYGA888ABjxozhqaee4vrrrw/o9QK9P4ZIqHG0ODfGjAb+AoQBz1hr7zvq8SnAg8COikN/tdY+U/HYFcDtFcfvttY+H5TQzVx4eGu/rMpSk61bt9KlS5d69UDqh72ISMONHj2aESNGcOedd/KrX/2KNm3aBOQ6wdgfQyTUONbWYowJA+YCPwdOAS4xxpxSw1MXWWtTKm6VhXl7YA5wOjAEmGOMaRek6NJA3333Xb1aWgoLM8nK6kROznS2bXuAnJzpZGV1orAwMwgpRUSaPmMMDzzwAAUFBQFbVrH6/hiViwn4fMWUlZUf93r3B+S6Is2dkyPnQ4Aca+1mAGPMS8D5wMZ6vPZc4B1r7d6K174DjAYWBiir+MHWrVsZO3Zsnc8J1mZITtNkPHET/X0LDKfbhVJTU7nkkkt4+OGHufbaa+nYsaNfzx+s/TFEQo2TE0I7Aduq3d9ecexoFxpjPjfGvGKM6Xycr8UYc7UxZo0xZk1BQYE/cksDHDhwgO+//56TTjqpzufV54e9iIjUzz333IPX6+WPf/yj388djP0xREKR2yeELgMWWmsPGmN+AzwP/Ox4TmCtfQp4CiA1NdX6P6LUx/bt24Fjr9QSKj/sNRlPRIKhW7duTJs2jccee4zp06dzyik1dY82TDD2xxAJRU6OnO8AOle7n8R/J34CYK3dY609WHH3GeC0+r5W3GXr1q3AsYvzyh/2NdEP+4ZLT08/om1GRAKj8nstPT2dVatWsWrVqiOOOeG2226jdevWzJ4926/nTUiYiDE1lxH+2h9DJBQ5WZx/AvQyxnQzxrQAJgFLqz/BGJNY7e544MuKz98CRhlj2lVMBB1VcUxcqr5rnOuHvYiIf8XFxXHrrbeybNky3n//fb+dNxj7Y4iEIsfaWqy1XmPM9ZQX1WHAfGvtBmPMncAaa+1S4EZjzHjAC+wFplS8dq8x5i7KC3yAOysnh4o77dhR/ouNpKSkOp9X+cP+6KW5jPH45Ye9G1tI3JRFRBrHrS1rv/3tb/nrX//K7bff7tcCPdD7Y4iEIkd7zq21y4HlRx27o9rntwK31vLa+cD8gAYUvykpKSE8PJyWLVse87n6Ye8fWhFGRCpFRkYyc+ZMbrrpJj755BMGDx7st3MHcn8MkVDkZFuLhJBDhw7RokWLej+/8od9jx5/IjFxqgpzEZFGuuqqq4iJiWHu3LlORxGROrh9tRZpJg4dOlSvUfNACNURZLf+el0kVLjt+61NmzZMmjSJf/zjHzz22GMB2zVURBpHI+cSFAcPHjyukXMREfG/qVOnUlJSwqJFx94zQqs8iThDI+cSFMfb1uJPGkEWESk3ZMgQTj31VObPn8+vf/1rp+OISA00ci5B4WRbi5T/Z0T/IRERYwxXXXUVq1evZuPGjU7HEZEaaORcgsLJkXMREfmvyy+/nFmzZjF//nweeuihIx4L1Tk6Im6ikXMJCrf0nGsEWURCXXx8POPHj+eFF17g0KFDTscRkaNo5FyCQm0tIiLuMXXqVF577TXeeOMNLrjggqrjmqMj4jyNnEtQqK1FRMQ9zj33XDp16sS8efOcjiIiR1FxLkFx+PBhIiIinI4hIiJAWFgYV1xxBf/+97/5/vvvnY4jItWoOJegiIyMpLS01OkYIiJSYdKkSfh8PpYuXVrj45qjI+IMFecSFDExMfz4449OxxARkQr9+vWje/fuLF682OkoIlKNinMJijZt2qg4F9fTjogSSowxTJgwgRUrVlBUVOR0HBGpoOJcgkLFuYiI+0yYMIFDhw7x5ptvOh1FRCqoOJegaNOmDUVFRVhrnY4iIiIVzjzzTOLi4tTaIuIiWudcgiImJgafz0dJSQnR0dFOxxGpoh0RJZSFhYUxfvx4Xn31VS15K+ISGjmXoGjTpg2AWltERFxmwoQJ/PDDD1X/ORURZ2nkXIKienGemJjocBqR/9KOiBLqzjnnHKKioli8eDEjR450Oo5IyNPIuQRFZXGuFQFERNwlMjKS0aNHs2TJEnw+n9NxREKeinMJipiYGEBtLSIibjRhwgR27NjB2rVrnY4iEvLU1iJBUTly/sMPPzicRKR2ameRUHXeeecRFhbGkiVLGDx4sNNxAsbrLSI/fxGlpZuIjOxFQsJEwsNjnI4lcgQV5xIUlX3mO3bscDiJ+IN6s0Wal/bt2zNkyBDeffddp6METGFhJtnZY7DWh89XjMcTTW7uDJKTlxMbO8zpeCJV1NYiQZGQkEDLli357rvvnI4iIiI1GD58OJ988gnFxcVOR/E7r7eI7OwxlJUV4fOVf30+XzFlZeXHvd79DicU+S8V5xIUHo+Hzp07s3XrVqejiIhIDdLT0/F6vXz44YdOR/G7/PxFWFvzZFdrfRQULApyIpHaqa1Fguakk07SyHkTps16RJq3M888k7CwMFatWtXsllQsLd1UNWJ+NJ+vmJKSnCAnEqmdRs4laE466SSNnIuIuFRMTAypqanN8j/akZG98Hhq3p3a44kmKqpnkBOJ1E4j5xI0Xbp0YefOnZx11ll4PJ5m+Q9Ac6bNekSav+HDh/Poo49SUlJCVFSU03H8JiFhIrm5M2p8zBgP8fETg5xIpHYaOZegOemkkwA4ePCgw0lERKQm6enpHD58mKysLKej+FV4eAzJycsJC4upGkH3eKIJCys/Hh7e2uGEIv+lkXMJmi5dugBw4MABIiMjHU4jIiJHGzp0KB6Ph1WrVnH22Wc7HcevYmOHkZaWR0HBIkpKcoiK6kl8/EQV5uI6Ks4lKNLT0yktLQXg888/rzpWSe0RTYveL5HmqU2bNpx22mnN9ns8PLw1iYlTnY4hUie1tUjQtGzZ0ukIIiJyDMOHD+ejjz6qGlARkeDSyLlLNbcthitHYTp27Ii1lj59+jTbkZnG0ERLEXFaeno6Dz30EKtXr2bEiBFOxxEJORo5d6HCwkyysjqRkzOdbdseICdnOllZnSgszHQ6WqP17t27We4+JyLSXJxxxhkArF271uEkIqGp1uLcGBNmjPmNMeYuY8zQox67PfDRQlNz32I4OTmZkpISrLVORxERkRp06NCBpKQk1q9f73QUkZBUV1vLk0AU8DHwmDFmlbW2cpHQXwB3BzpcKKrPFsNNeTJLcnIyZWVlPPfcc05HcQ3tvCkibpOSkqLiXMQhdbW1DLHWTrbW/hk4HWhtjHnNGNMSMMGJF3qa+xbDycnJAGRnZzucREREajNw4EC++uorTQoVcUBdI+ctKj+x1nqBq40xdwDvAloUNEAqtxiuqUBvzBbDbplg2q9fP6C8OB8/fnzQr+9G2nlTRNwmJSWFsrIyNmzYQGpqqtNxREJKXSPna4wxo6sfsNbeCTwLdA1kqFCWkDARY2p+Wxq6xbCbJpjGxMTQtWtXjZyLiLhYSkoKgFpbRBxQa3Furb3MWvtmDcefsdZGBDZW6PL3FsNunGCanJys4lxExMW6du1KmzZtVJyLOEDrnLuQP7cYduME0+TkZJYvX87Bgwe1MdFR1M4iIm7g8XgYMGAA69atC+h13NJyKeImKs5dyl9bDLtxgmnlii1fffUVAwYMCPr1RUTk2FJSUpg/fz4+nw+Px//bohQWZpKdPQZrffh8xXg80eTmziA5eTmxscP8fj2RpkKbEDVzlRNMa9KYCaaNoRVbRETKJ4BXXzbVbVJSUiguLiY3N9fv53Zjy6WIW9SrODfG/MIY84gx5mFjzAWBDiX+E4gJpo3Vu3dvIiIiVJyLiLjYwIEDgcBMCq1Py6VIqDpmcW6MeRy4BsgGvgB+Y4yZG+hg4h/+nmDqDxEREfTv359PPvkk6NcWEZH6OfnkkwH45ptv/H5uN7ZcirhFfXrOfwb0tRX7rRtjngc2BDSV+JU/J5j6S1paGs8++yxer5fwcE19EJHQ0JR2BI6MjCQxMZHNmzcH4NyB2dNDpDmoT1tLDtCl2v3OFccazRgz2hjztTEmxxgzu4bHZxhjNhpjPjfGrDTGnFTtsTJjzPqK21J/5GnOKieY9ujxJxITpzpamEN5cV5cXMwXX3zhaA4REald9+7dA1Kcu7HlUsQt6jNkGQN8aYz5GLDAEMo3KFoKYK1t0DaPxpgwYC4wEtgOfGKMWWqt3VjtaeuAVGttiTHmWuABoPI7ttRam9KQa4vz0tLSAMjKyqra7EJEpLlrajsCd+/evWqE358qWy6PXq3FGI9jLZciblGf4vyOAF17CJBjrd0MYIx5CTgfqCrOrbXvVXv+auCyAGWRIOvatSsnnHACWVlZXHvttU7HERGRGnTv3p2///3vHDp0iBYtWvj13G5suRRxg2MW59Za//+XuVwnYFu1+9uB0+t4/lTg39XutzLGrAG8wH3W2sU1vcgYczVwNUCXLl1qeoo4wBhDWloaWVlZTkcREZFadO/eHWstW7dupVevXn4/v7/29BBpTmrtOTfGZFZ8LDLG/FjtVmSM+TF4EcEYcxmQCjxY7fBJ1tpUYDLwZ2NMj5pea619ylqbaq1NjY+PD0Jaqa+0tDRycnIoKChwOoqISNBlZGS4uqUFyotzICB95yJSs1qLc2vtsIqPMdbaNtVuMdbaNn649g7KJ5dWSqo4dgRjzDnAbcB4a+3Bavl2VHzcDGQAA/2QSYKosu989erVDicREZGaqDgXCb76bkIUZozpaIzpUnnzw7U/AXoZY7oZY1oAk4AjVl0xxgwEnqS8MM+vdrydMaZlxedxwFCq9apL05Camkp4eLhaW0REXOrEE0+kVatWKs5FguiYPefGmBuAOcD3QOV2Xhbo35gLW2u9xpjrgbeAMGC+tXaDMeZOYI21dinlbSytgZeNMQDfVawO0xd40hjjo/w/GPcdtcqLNAGRkZGkpKQ06eK8Kay2ICLSUB6Ph27duqk4Fwmi+qzW8lugj7V2j78vbq1dDiw/6tgd1T4/p5bXfQgk+zuPBF9aWhrz5s0L6GZEKqBFRBque/fu5ObmOh1DJGTUp61lG/BDoINIaPp//+//UVJSwpo1a5yOIiIiNUhKSiIvL8/pGCIho9ahSmPMjIpPNwMZxpg3gOoTMh8JcDYJASNGjABgxYoVnHHGGQ6nqZ+mtP22iEhjxcXFsWfPHnw+Hx5PvaaqiUgj1NVHEFPx8buKW4uKm4jfxMXFMXDgQFauXMntt9/ut/OqgBYR8Y/4+Hh8Ph+FhYW0b9/e6TgizV6txbm19n+DGURC19lnn81jjz1GSUkJUVFRTsc5pqa2/baISGPExcUBsHv3bhXnIkFQn9Va3gEuttYWVtxvB7xkrT030OEkNJxzzjk89NBDZGZmMmrUKL+cUwW0iIh/VBbke/b4fV0IEalBfZrH4isLcwBr7T4gIXCRJNQMGzaMiIgIVqxY4XQUERE5Srt27QDYt2+fw0lEQkN91q4rM8Z0sdZ+B2CMOYnydc5F/CI6OpozzzyzSRbnGo0XkeZOxblIcNWnOL8NyDTGrAIM8P+AqwOaSkLO2WefzZw5c9i9e3dVf6O/qID2P7UKiYQOFeciwXXMthZr7ZvAIGAR8BJwmrX2rUAHk9ByzjnnYK3lvffeczqKiIhUo+JcJLjqu2DpmUB6xa1pLEYtTcrgwYOJiYlh5cqVTkcREZFqIiIiiI6OVnEuEiT1Wa3lPmAw8I+KQ781xpxprf19QJNJSAkPDyc9PZ133nnH6ShSC60dL+IOTrSVtWvXTsW5SJDUZ+R8DDDSWjvfWjsfGA2MDWwsCUWjRo1i8+bNbNq0yekoIiJSTUxMDEVFRU7HEAkJ9ZkQChAL7K34vG2AskiIGzt2LDfccAPLli1jxowZTseRo2jteJHQ1bJlSw4fPux0DJGQUJ/i/E/AOmPMe5Sv1nIWMDugqSQkde3alX79+qk4FxE5itNtZS1atODgwYMBvYaIlKuzrcUYY4BMyieBvga8CqRZaxcFIZuEoLFjx/Kf//yHwsLCYz9ZRESCokWLFhw6dMjpGCIhoc6Rc2utNcYst9YmA0uDlElC2Lhx47jvvvt48803mTRpktNxpBZqZxEJLqfbyjRyLhI89ZkQ+qkxZnDAk4gAp59+OnFxcSxbtszpKCIiUqFly5YaORcJkvr0nJ8OXGqM2QoUU953bq21/QOaTEJSWFgY5513HkuXLsXr9RIeXt85yyIiEihqaxEJnvpUPucGPIVINePGjeP555/nww8/5KyzznI6joiIqzjRVqa2FpHgqU9bSyKw11q71Vq7FdgHnBjYWBLKRo0aRUREhFpbRERcQiPnIsFTn+L8b8D+avf3VxwTCYiYmBjS09NVnIuIuIR6zkWCpz7FubHW2so71lof9d+8SKRBxo0bx9dff63dQkVEXEAj5yLBU5/ifLMx5kZjTETF7bfA5kAHk9A2fvx4AP71r385nERERMLCwvB6vU7HEAkJ9SnOrwHOBHYA2ylfveXqQIYSOemkk0hNTeWf//yn01FEREKe1+slIiLC6RjNltdbRF7eM+TmziIv7xm83iKnI4mDjtmeYq3NB7QbjATd5MmTmTFjBl988QX9+vVzOo6ISMjS0raBU1iYSXb2GKz14fMV4/FEk5s7g+Tk5cTGDnM6njig1pFzY8wtFR//zxjz2NG34EWUUHXZZZcRERHB/PnznY4iIhLSVJwHhtdbRHb2GMrKivD5igHw+YopKys/7vXuP8YZpDmqq63ly4qPa4C1NdxEAio+Pp7x48ezYMECTUQSEXFQKBXnwWwxyc9fRPk6Gz9lrY+CgkUBu7a4V63fadbaZRUfnw9eHJEjTZ06lVdffZVly5Zx4YUXOh1HRCQkhUpxHuwWk9LSTVUj5kfz+YopKcnx+zXF/Wr9TjPGLK3rhdba8f6PI3KkUaNG0alTJ+bNm6fiXETEIaFQnFdvMalUWThnZ48hLS2P8PDWfr1mZGQvPJ7oGgt0jyeaqKiefr2eNA11tbWkAUnAf4CHgIePuokEXFhYGFOmTOGtt95i+/btTscREQlJoVCcO9FikpAwEWNqLsWM8RAfP9Hv1xT3q6s4PxH4PdAP+AswEthtrV1lrV0VjHAiAFdeeSU+n4/nn1eHlYiIE0KhOHeixSQ8PIbk5OWEhcXg8UQD5SPmYWHlx/09Ui9NQ63FubW2zFr7prX2CuAMIAfIMMZcH7R0IkCPHj1IT09n/vz5+Hw1j2qIiEjghEJxXtliUpNAtpjExg4jLS2PXr3+QufOs+nV6y+kpeVpGcUQVucmRMaYlsaYXwB/B6YBjwHaslGCburUqWzevJn333/f6SgiIiEnFIpzJ1tMwsNbk5g4lR49/kRi4lSNmIe4utY5fwHIAgYB/2utHWytvctauyNo6UQqXHjhhbRt25Ynn3zS6SgiIiHn4MGDtGjRwukYAaUWE3GLuv4bfBlQDPwWuNEYU3ncANZa2ybA2USqREZGcuWVVzJ37lx27drFiSee6HQkEZGQ8eOPP9KtWzenYwRcZYtJQcEiSkpyiIrqSXz8RBXmElR19Zx7rLUxFbc21W4xKszFCddddx2HDx/m6aefdjqKiEhI+fHHH2nTJjT+6VeLiTitzp5zkUrB3DGtNr169WLUqFE8+eSTeL3eoF9fRCRUhVJxLuI0FedyTIWFmWRldSInZzrbtvbyxQQAACAASURBVD1ATs50srI6UViYGfQs06ZNY8eOHSxZsiTo126s9PR00tPTnY4hInJcrLUqzkWCSMW51Kn6jmmV67/6fMWUlZUf93r3BzXPeeedx0knncTcuXODel0RkVB14MABvF6vinORIFFxLnVyYse0uoSFhXHttdfy3nvvsWHDhqBeu6nQCL2I+NOPP/4IoOJcJEia96Kl0mhO7Jh2LFOnTmXOnDk8/vjjrh9Br14kr1q16ifHMjIyghtIROQ4qTgXCS6NnEudnNoxrS5xcXFMnDiRF154oeofDRERCQwV5yLBpZFzqVNCwkRyc2fU+Figd0yry7Rp03jhhRdYsGAB06ZNcyRDfVQfGa8cMQ/EaLlG6EUaJpDfl83FDz/8ADS/4tzrLSI/fxGlpZuIjOxFQsJEwsNjnI4lopFzqZtbd0wbMmQIqampzJ07F2utIxlEREJBcyzO3bQKmcjRNHIux+TUjmnHGtG6/vrrmTJlCitWrGDkyJEBzeJ2wRqhF5HQs2fPHgA6dOjgcBL/qL4KWaXKuVXZ2WNIS8vTxkPiKBXnUi+VO6a5yaRJk5g9ezYPP/xwkyjOVSyLuIPawI7Ptm3bMMbQsWNHp6P4RX1WIXPbv3cSWhxtazHGjDbGfG2MyTHGzK7h8ZbGmEUVj39kjOla7bFbK45/bYw5N5i5xR1atmzJ9ddfz1tvvcUXX3zhdBwRkWZp27ZtnHjiiURERDgdxS/cuAqZSHWOjZwbY8KAucBIYDvwiTFmqbV2Y7WnTQX2WWt7GmMmAfcDE40xpwCTgFOBjsAKY0xva21ZcL8K8bfjHdG65ppruOeee3jkkUeYP39+EBK6n0b9ROqmNrDjs23bNjp37ux0DL+pXIWspgLdqVXIRKpzcuR8CJBjrd1srT0EvAScf9Rzzgeer/j8FeBsY4ypOP6StfagtfZbIKfifBJiOnTowJVXXsk//vEPdu3a5XQcEZFmZ9u2bXTp0sXpGH6TkDARY2ouf5xchUykkpPFeSdgW7X72yuO1fgca60X+AHoUM/XAmCMudoYs8YYs6agoMBP0SVQMjIyqm7Dhw9n+PDhRxyryU033cThw4f561//GtywIUY7j4qEHmttsxs5d+sqZCKVmv2EUGvtU8BTAKmpqVpzrxnq2bMnEyZM4G9/+xu33nor0dE1b5okInI0tbPUbd++fZSUlDSr4hycW4VMpD6cHDnfAVT/bk+qOFbjc4wx4UBbYE89Xysh5Hf/v707D4+yOvs4/r2TABKIBmQLiBAhVamxiAEBERAXDFihLZVFWnewKoq4gEtRQEFxQUu1ShEVVEStIiqoyI6gNCgaZTGJVtGgIApvgAhOct4/MokBEsg288zy+1zXXJl5trknefLMPWfOOfeNN/Ljjz/yzDPPHH5jERGpkM2bi76kjrTkHH6dhaxNm0kkJV2uxFxChpct5/8FUswsmaLEehAw5IBt5gEXA6uBAcBi55wzs3nA82b2EEUDQlOANUGLXIKiMi1aXbt25bTTTuOhhx5i+PDhxMbGBi6wKKIp50RCTzArW0Zyci4SqjxrOff3Ib8WeBvYALzonPvMzMab2QX+zZ4EjjazbGAUMMa/72fAi8B64C3gGs3UEt3MjBtvvJGcnBzmzZvndTgiIgER7MqWX3/9NUBEDQgVCXUWTaXP09LSXEZGhtdhSID4fD5SUlJo0aIFK1eqBHNN05RzIt7y+fJYvbrFfpUti8XGJgSksuWtt97Kgw8+yM8//0xMjKelUUTCipmtdc6lVWVf/adJxIiLi+OGG27gvffeY9WqVV6HIyJSoypS2bKmffXVVxxzzDFKzEWCSP9tElEuv/xyGjVqxB133EE0fSskIpHPi8qWGzdu5Pjjj6/x44pI+ZScS0SpV68ed955J0uWLGH+/PlehxNRDjXXvIgEXnFly7IEorJlYWEhGzdu5MQTT6zR44rIoSk5l4gzfPhwUlJSuPnmm/H5fF6H4xmfL4/c3Onk5IwmN3c6Pt/B/VRFJHwEu7LlV199RX5+Pu3atavR44rIoSk5l4hTq1Yt7rvvPjZs2MCMGTO8DscTwZ7RQUQCL9iVLTds2ACglnORINNsLeK5QMzZ65yje/fuZGVlkZWVRUJCYOYADkVezOggIsHj8+0KSmXLBx54gJtvvpnt27fTsGHDGj++SCSrzmwtXhYhEmHHjpVkZvbBuUIKC3cTE1OPnJxRpKbOJzGxW5WPa2Y88MADdO7cmfvvv5/x48fXYNShrSIzOiQlXR7kqESkphRXtgy0DRs20LRpUyXmIkGmbi3iGZ8vj8zMPhQU5JXMQFBYuJuCgqLlPt+uah3/tNNOY+DAgTzwwAN8++23NRFyWPBiRgcRiTzr169XlxYRDyg5F8CbwYPBmLN30qRJFBQUMHbs2GofK1wEe0YHEYk8zjk2bNgQUsm5BrlLtFByLp4NHgxGC29ycjIjRozgqaee4pNPPqn28cJBsGd0EJHIs2XLFnbu3BkyM7VokLtEEyXnUS7QXUsOJVgtvLfffjuJiYnccsstNXK8UBfsGR1EJPKE0kwtXr5PiXhByXmU86IcdLFgtfA2aNCAv//977z99tssWLCgRo4Z6hITu9GlSy4pKY/QsuUYUlIeoUuX3GoNshWR6PHZZ58BoZGce/k+JeIFJedRzsvBg8Fs4b3mmmv4zW9+w8iRI9m3b1+NHTeUFc/o0KbNJJKSLleLuYhUWEZGBklJSSQlJXkdiga5S9RRch7lvB48GKwW3tq1a/Pwww/z+eef849//KNGjy0iEmnWrFlDx44dMTOvQ/H8fUok2JScR7lQGDwYrBbe9PR0zj//fMaNG8eWLVsC8hwiIuFux44dbNq0iU6dOnkdChAa71MiwaTkPMpF2+DBKVOmsG/fPm699VavQxERCUnFlbRDJTmPtvcpEVUIlZKuJcEoB+21tm3bMmrUKO69916uuuoqOnfu7HVIIiIh5b///S8AaWlVqjweENH0PiVizjmvYwiatLQ0V9wiINFr165dHH/88TRv3pwPPviAmBh9gSQiUuwPf/gDn332GZ9//rnXoYiELTNb65yr0idcZSUSderXr8/kyZPJyMjg6aef9jocEZGQsmbNmpDp0iISjZScS1QaMmQIXbt2ZcyYMezYsaPc7VQuWkSiybfffktubq6ScxEPKTmXqGRmTJ06lR9++IHx48eXuY3KRYtItCnub96xY0ePIxGJXkrOJWp16NCBK6+8kqlTp7J+/fr91qlctIiEi549e9KzZ88aOdaaNWuIi4ujffv2NXI8Eak8JecS1e6++27q16/PddddR+nB0SoXLSLR6IMPPiA1NZW6det6HYpI1FJyLlGtcePG3HPPPSxatIjnn3++ZLnKRYtItPn5559ZtWoVPXr08DoUkaimec4l6g0fPpxnnnmGUaNGkZ6eTsOGDUvKRZeVoKtctIh4rXQ3lmXLlh20bOnSpZU+5urVq/n555/p1atXNaMTkepQy7lEvdjYWKZNm8ZPP/3E8OHDcc6pXLRUS032ARYJlsWLFxMbG6uWcxGPqeVcBPjd737H3XffzejRo3nmmWe45JJLSE2dT2ZmH5wrpLBwNzEx9TCLUbloEfFc6Zbx4g+CVWktL23RokWkpaVx5JFHVus4IlI9Ss5F/G688UYWLFjAiBEj6NatG23bqly0iESHvLw81qxZw+jRo70ORSTqKTkX8YuNjWXmzJmcfPLJDB06lBUrVlCrVn2Ski73OjQJA4HoAywSLMuXL6egoICzzjrL61BEop76nIuU0rJlS6ZNm8YHH3zAhAkTvA5HROSwli5dWu0Pf4sXL6ZOnTp06dKlZoISkSqz0nM7R7q0tDSXkZHhdRgSBi699FJmzpzJsmXL6Natm9fhSCXUVP/bcI9Bqifa/obt27fn6KOPZtGiRWWuj7bfh0h1mdla51xaVfZVy7lIGf7xj3/QunVr/vKXv7Bz506vwxERCZgffviBjz/+WFMoioQIJeciZUhISOC5555j8+bNXHvttV6HU2Gawk9EKmvJkiUA6m8uEiI0IFSkHJ07d2bs2LHceeed9O7dm6FDh3odkpQj1AZj6qv/8BRq51GwvPvuuyQkJJCWtv838NH6+xDxmlrORQ7htttu44wzzuCqq65i06ZNXocjIlKjCgsLeeONNzj33HOJi1N7nUgo0IBQkcP49ttvad++PUlJSXzwwQfUrVvX65D2U1brVukKf9HWuqWBa1ITouU8WrNmDaeddhqzZs065LeD4fL78Pny2Lp1Dvn5WdStm0KTJgOJi0vwOiyJQtUZEKqPyVJjIvWi2KJFC2bNmkV6ejrXX38906ZN8zqkgAuXN2IRqZ65c+cSGxtL3759vQ6l2nbsWHlQVeecnFGkps4nMVGzbkn4UHIuNSLSL4rnnXcet956K5MmTaJHjx5cdNFFXodUIhBlvEUkOsydO5eePXvSoEEDr0OpFp8vj8zMPhQU5JUsKyzcDUBmZh+6dMlVdWcJG0rOpdqi5aI4fvx4VqxYwfDhw0lLS+P444/3OiQpgz6YSE2IhvPo888/Z8OGDVx99dWH3TbUfx9bt87BucIy1zlXyLZtc1TtWcKGknOptmi5KMbFxTF79mxOOeUULrzwQt5///2Q639eHZqZQSS6vPbaawBccMEFHkdSffn5WSWNQgcqLNzNnj3ZQY5IpOo0W4tUWzRdFI855hhmzZrFJ598wsiRI70O5yA1UcZbpKo0z354mTt3Lh06dODYY4/1OpRqq1s3hZiYemWui4mpR3x82yBHJFJ1ajmXaiu+KJaVoEfiRfG8885jzJgx3HvvvfTo0YMhQ4Z4HVKNUN91kejx3XffsXr1asaNG+d1KDWiSZOB5OSMKnOdWQyNGw8MckQiVaeWc6m2Jk0GYlb2qRSpF8UJEyZw+umnM3z4cM1/LiJh5/XXX8c5R//+/b0OpUbExSWQmjqf2NiEkhb0mJh6xMYWLY+EcU8SPdRyLtVWfFE8cLYWs5iIvSjGxcXxwgsv0L59ewYMGMCqVatISAj/aSNFKktjFbxV1W+55s6dy3HHHcdJJ51U80F5JDGxG1265LJt2xz27MkmPr4tjRsPjMj3IIlsSs6lRkTjRfGYY45h9uzZpKenM2jQIObOnUutWrW8DqtGKKESiVx5eXksWrSIa665BjPzOpwaFRdXPyImIJDo5klybmYNgTlAa+B/wIXOuZ8O2KY98C/gSKAAuMc5N8e/7mmgB7DTv/klzrl1wYhdyheNF8VzzjmHxx57jOHDhzN8+HCefPLJiHuzEzkUjVUIP//5z3/Yu3cvAwYM8DoUESmDVy3nY4BFzrl7zWyM//HoA7bZA/zVOZdlZs2BtWb2tnNuh3/9zc65l4MYc8SI1EqeXhk2bBi5ubmMGzeOZs2aMXHixHK31e9eRKqrul2JZs6cSUpKCp07dw5AdCJSXV4l5/2Anv77zwBLOSA5d859Xup+rpltBRoDO5Aqi/RKnl6588472bJlC5MmTSIpKYkRI0YctI1+9yLita+//pqlS5dy11136Vs+kRBlzrngP6nZDudcov++AT8VPy5n+04UJfG/dc4V+ru1dAH2AouAMc65veXsOwwYBnDsscee+tVXX9XoawknPl8eq1e32K+SZ7HY2ISIqeTplYKCAgYMGMBrr73GCy+8wIUXXliyTr97EQmEynYlmjRpErfddhs5OTkcd9xxgQtMJMqZ2VrnXFpV9g3YVIpm9q6ZfVrGrV/p7VzRp4NyPyGYWRIwC7jU/VqG8lbgBKAj0JCDu8SUPv4051yacy6tcePG1X1ZYa0ilTyl6mJjY3n++ec58sgjGTRoEIsXLy5Zp9992VS0RiR4nHPMnDmTbt26KTEXCWEBS86dc2c7504q4/Ya8L0/6S5OvreWdQwzOxJ4E7jdOfd+qWNvcUX2Ak8BnQL1OiJJNFXy9ErdunX57W9/S3x8PP379+ejjz4C9LsXEe8tXLiQjRs3cvnl0TVwXyTceFWEaB5wsf/+xcBrB25gZrWBV4GZBw78LJXYG9Af+DSg0UYIlTcOjlq1apGamkpiYiLp6el88cUX+t2LSEAsXbq0wl1aHnjgAZKSkhg8eHBggxKRavFqQOi9wItmdjnwFXAhgJmlAVc5567wL+sOHG1ml/j3K54y8TkzawwYsA64KsjxhyWVNw6csmZPSEtLY926dZx00klkZ38adVVUy6OiNSLBt27dOhYuXMikSZOoU6eO1+GIyCF40nLunNvunDvLOZfi7/7yo395hj8xxzn3rHOulnOufanbOv+6Xs65VH83maHOuV1evI5wo/LGwVWvXj1OOukk9u7dS79+A0lOflm/exHxxIMPPkj9+vW56iq1ZYmEOk9ma/FKWlqay8jI8DoMz/l8u6KqkmewHTh7whtvvEH//v0566yzePXV2ezc+ap+934qWiMSeJs3b+a4447j2muvZcqUKV6HIxIVqjNbi1fdWsRD0VjJ81ACXRjo/PPP59///jeXXXYZV145gpkzZxIbG1tjxxcROZSHH34Y5xwjR470OhQRqQAl5xLVglUY6NJLL2Xr1q2MGTOGevXq8cQTT6gAiIgEXG5uLo899hhDhgyhVatWXocjIhWg5Fyils+XR2Zmn/0KAxVPd5iZ2afKhYHK66IxevRo8vLyuOeee4iPj2fKlClRn6CrO4tIYE2YMAGfz8ddd93ldSgiUkFKziVqVaQwUE13/5kwYQK7du3ikUceIS4ujvvvvz/qE3QRCYycnBymT5/OsGHDVHRIJIwoOZeo5UVhIDNjypQp+Hw+HnzwQX766SeeeOIJ4uL0rygiNWvs2LHUqlWLO+64w+tQRKQSlBFI1CouDFRWgh7IwkBmxtSpUzn66KMZP348P/30E88//zxHHHFEQJ5PRKLPJ598wuzZsxk9ejRJSUlehyMileBVhVARzzVpMtCzwkBmxrhx43jkkUd49dVX6du3L3l5eYffUUSkAm6//XaOPPJIbrnlFq9DEZFKUnIuUSsUijJdd911zJo1i2XLltGrVy+2bdsW8OcUkcj23nvv8cYbb3DLLbfQoEEDr8MRkUpSESKJeqFQlOmNN97gz3/+M61ateKdd97h2GOPDerzi0hkcM7Rs2dPNm3aRE5ODvXq1fM6JJGopCJEItUQCkWZzj//fN555x3OP/98Tj/9dBYuXMgJJ5zgaUwiEn7eeecdli9fztSpU5WYi4QpdWsRCRFnnHEGy5Yt45dffqFbt27oWx4RqYzCwkJuu+02WrduzbBhw7wOR0SqSMm5SAhp3749K1euJCEhgTPPPJN3333X65BEJEy8/PLLfPjhh4wbN47atWt7HY6IVJGSc5EQ07ZtW9577z2Sk5NJT0/nqaee8jokEQlxu3fv5qabbiI1NZWLLrrI63BEpBqUnIuEoObNm7NixQrOPPNMLrvsMsaOHUs0Dd4Wkcq5++672bx5M48++iixsbFehyMi1aDkXCREHXXUUbz55ptcdtllTJgwgYsvvph9+/Z5HZaIhJiNGzfy4IMP8te//pUzzjjD63BEpJo0W4tICKtVqxbTp0/nuOOO44477mDz5s289NJLNGrUyOvQqsTny2Pr1jnk52dRt24KTZoMJC4uweuwRMKWc45rr72W+Ph4Jk+e7HU4NU7XDIlGSs5FQpyZcfvtt9O6dWsuu+wyOnTowMsvv0ynTp28Dq1SduxYSWZmH5wrpLBwNzEx9cjJGUVq6nwSE7t5HZ5IWHrxxRdZtGgR//znP2natKnX4dQoXTMkWqlbi0iYuOiii1i1ahWxsbF069aNRx99NGz6oft8eWRm9qGgII/Cwt0AFBbupqCgaLnPt8vjCEXCT15eHqNGjaJDhw5cddVVXodTo3TNkGim5FwkjJx66qmsXbuWc889l2uvvZaLLrqIXbtC/01q69Y5OFdY5jrnCtm2bU6QIxIJf3fddRdbtmzhsccei7hBoLpmSDRTci4SZho2bMi8efOYOHEic+bMoVOnTmzYsMHrsA4pPz+rpPXrQIWFu9mzJzvIEYmEt8zMTB555BGuuOIKTjvtNK/DqXG6Zkg0U3IuEoZiYmK49dZbWbhwIT/88AMdO3bkhRde8DqsctWtm0JMTNmlxGNi6hEf3zbIEYmEr59//plLL72Uo446iokTJ3odTkDomiHRTMm5SBjr1asXH330Ee3bt2fw4MGMGDEiJKdbbNJkIGZlX27MYmjceOBBy3v27EnPnj0DHJlI+Bk1ahRr165lxowZYTtz0+FU5ZohEimUnIuEuRYtWrBkyRJGjRrFP//5T7p3787//vc/r8PaT1xcAqmp84mNTShpDYuJqUdsbNHyuLj6HkcoEh6ef/55/vWvf3HTTTfRr18/r8MJGF0zJJpZuMz2UBPS0tJcRkaG12GIBMx//vMfLrvsMgCeeOIJBg0a5HFE+/P5drFt2xz27MkmPr4tjRsPLPdNtrjVfOnSpcELsByhFItEr1WrVtGrVy86duzI4sWLqVWrltchBVxlrhkiocTM1jrn0qqyr+Y5FwkQL4pn/OlPf6JDhw5cdNFFDB48mLfeeoupU6eSkBAaRTvi4uqTlHR5uetLd2NZtmzZQcuUHAeOPoCEtuzsbPr160fLli159dVXoyIxh8NfM0Qikbq1iATAjh0rWb26BdnZI9m8eTLZ2SNZvboFO3asDPhzJycns3z5csaOHcusWbM45ZRTWLNmTcCfV0QCY/v27fTp0wfnHPPnz4/YfuYiUkQt5xJSIqFUc+niGcWKpwTLzOxDly65Af9aNi4ujnHjxnH22WczdOhQunTpwg033MC4ceOoV6/sGRBCQelWW69bctWKHx1C/Zrz888/079/f77++msWLVpESkqK1yGJSIApOZeQESmlmitSPCNYX9OeccYZfPzxx4wZM4YHH3yQV155hccff5xzzz03KM8voS3aP4CE+jWnsLCQSy+9lJUrV/LCCy9w+umnex2SiASBknMJCaHQ2lxTQq14RmJiIo8//jhDhgxh2LBh9O7dm7/85S889NBD+nr8EEKpFV9qXjhcc/7+97/zwgsvMGnSJAYO1NSBItFCybmEhFBqba6u4uIZZSXoXhbP6N69O+vWreOee+7h3nvvZcGCBTz88MMMGTIEM/MkpkNRIhx40fwBJNSvOdOnT2fixIlceeWVjB492rM4RCT4NCBUQkKotTZXRygXzzjiiCOYMGECH330EW3btmXo0KGkp6eH3LzoIoEWytecd955h6uuuorevXvz6KOPhuSHZxEJHCXnEhIiqVRzOBTPOOmkk1i5ciVTp07lvffe47e//S0PPfQQPp/P69BC0tKlS6OmRTlahOo1JzMzkwEDBtCuXTtefPHFqJkyUUR+pSJEEhJ8vjxWr26xX//PYrGxCSHR/7OywqV4xubNm7n66qt54403OPXUU5k+fTrt27cP2vOH+mwZEplC8ZqTm5tL586dKSgo4P3336dly5ZBfX4RqTnVKUKk5FxCRlkzJ5jFhMzMCZHMOcdLL73EiBEj2L59OzfeeCNjx44N+LSL+puLl0Lp/MvLy6NHjx5kZWWxYsWKoH5AFpGap+S8gpSch75waW2OVD/++CM333wzM2bMoEWLFkycOJGLLrqI2NjYGn+uUGy5lOgTCtecXbt2kZ6ezurVq5k3bx59+vQJ6vOLSM1Tcl5BSs5FKua9997j+uuvZ+3atbRr147x48fzxz/+sUYHpuXmTic7e2S5s9qkpDwSNjP0iFTVrl27+P3vf8/y5cuZPXs2F154odchiUgNqE5yrgGhInKQ008/nTVr1vDSSy9RWFjIgAED6NixI2+99RY19YE+lGfLEAmG7OxsunTpwvLly5k1a5YScxEBlJyLSDliYmIYMGAAmZmZPP3002zfvp309HR69OjBihUrqn38UJ0tQyQYFixYQMeOHcnNzeXtt99myJAhXockIiFCybmIHFJcXBwXX3wxmzZt4tFHHyUrK4vu3buTnp7O2rVrq3zcUJ4PXiRQnHNMnDiRvn370qpVKzIyMjj77LO9DktEQoiScxGpkNq1a3P11VeTk5PD5MmTWbNmDWlpaQwYMID169dX+njhMB+8SE3Ky8vjz3/+M7fffjuDBg1i1apVJCcnex2WiIQYDQgVkSrZuXMnU6ZM4aGHHmL37t0MHTqUO++8k+OOO65SxwmF2TJEAi0rK4v+/fuzceNG7r//fm644QZV/hSJYJqtpYKUnIvUvB9++IHJkyczdepUfD4fV1xxBaNHj6Z169ZehyYSEhYsWMDgwYOJi4tjzpw5nHXWWV6HJCIBptlaRMQzjRo1YvLkyeTk5DBs2DCefPJJ2rZty+DBg/nwww+9Dk/EM8457rnnHvr27UtycjIZGRlKzEXksJSci0iNaN68OY8++ihffPEFN9xwA2+++Sannnoq55xzDu+8806NTcEoEg7y8vIYMGAAd9xxB4MHD+a9997Tt0kiUiGeJOdm1tDMFppZlv9ng3K2KzCzdf7bvFLLk83sAzPLNrM5ZlY7eNGLyKEcc8wx3H///WzevJn77ruPzz77jN69e3PKKafw7LPPsm/fPq9DFAmoTZs20blzZ+bOncuDDz7Is88+S3x8vNdhiUiY8KrlfAywyDmXAizyPy5LvnOuvf92Qanl9wFTnHNtgZ8AlREUCTFHHXUUt9xyC19++SUzZsxg3759/OUvf+HYY49l7NixfPvtt16HKFKjnHNMmzaNDh068P3337Nw4UJGjRqlgZ8iUileJef9gGf8958B+ld0Ryu6yvUCXq7K/iISXHXq1OHSSy/l008/5a233qJTp07cfffdtGrVigsvvJDly5ery4uEvc8//5zf//73DB8+nK5du/Lxxx/Tq1cvr8MSkTDkVXLebHa90QAAFqJJREFU1Dm3xX//O6BpOdsdYWYZZva+mRUn4EcDO5xzPv/jb4AWAYxVRGpATEwMvXv3Zt68eeTk5DBq1CjeffddevTowcknn8xjjz3Gjz/+6HWYIadnz5707NnT6zCkHN9//z1XX3017dq1Y9myZUyZMoW3336bFi30tiQiVROw5NzM3jWzT8u49Su9nStqMiuv2ayVfxqaIcDDZtamCnEM8yf4Gdu2bav8CxGRGpecnMzkyZP55ptvePLJJ6lVqxbXXHMNSUlJDBgwgHnz5qlvuoS0vLw87rrrLtq0acO///1vmjZtSmpqKiNHjiQmRnMtVJbPl0du7nRyckaTmzsdny/P65BEPBOwK4hz7mzn3Ell3F4DvjezJAD/z63lHONb/88vgKXAKcB2INHM4vybHQOU23nVOTfNOZfmnEtr3Lhxjb0+Eam++Ph4LrvsMtauXcuHH37I1VdfzYoVK+jXrx8tWrRgxIgR/Pe//1W3FwkZv/zyC4899hht27Zl3LhxpKens379elJSUqhdW3MTVMWOHStZvboF2dkj2bx5MtnZI1m9ugU7dqz0OjQRT3hShMjM7ge2O+fuNbMxQEPn3C0HbNMA2OOc22tmjYDVQD/n3Hozewn4j3PuBTN7HPjEOffY4Z5XRYhEQt8vv/zCO++8w8yZM3nttdfYu3cvJ5xwAn/9618ZOnQoLVu29DrEgCvdjWXZsmUA9OjRo2TZ0qVLgxyROOd45ZVXuPXWW8nKyqJ79+5MnjyZ0047Dfj1b6a/TeX4fHmsXt2CgoKDW8pjYxPo0iVXFYMlLIVjEaJ7gXPMLAs42/8YM0szs+n+bU4EMszsY2AJcK9zbr1/3WhglJllU9QH/cmgRi8iAVOrVi369u3LnDlz+O6775g2bRqNGjXitttuo1WrVpx11lk888wz5OXpa2+pGYfr179ixQq6du3KgAEDqF27Nq+//jpLly5l9OjRJfsuW7aMZcuWlTwOpXECoRZPaVu3zsG5wjLXOVfItm1zghyRiPfiDr9JzXPObQcOKpPmnMsArvDfXwWklrP/F0CnQMYoIt5LTEzkyiuv5Morr+SLL77g2WefZebMmVxyySVcffXV/OEPf2DQoEGcffbZHHHEEV6HW2NKt76qRdY769evZ8yYMbz++uu0aNGCJ598kosvvpjY2FivQ4sY+flZFBbuLnNdYeFu9uzJDnJEIt7zJDkXEams4447jrFjx/L3v/+d1atXM3PmTObMmcNzzz1H/fr1SU9Pp3///vTt25ejjjrK63AljH399ddMmDCBGTNmUL9+fSZOnMj1119/UCEhfYiqvrp1U4iJqVdmgh4TU4/4+LYeRCXiLSXnIhJWzIyuXbvStWtXHnnkEZYsWcLcuXN57bXXeOmll6hVqxa9evWif//+9OvXj6SkJK9DlhBUVr/+1NRUtmzZwvbt26lVqxbXXXcdt99+O40aNfIoyqor6/WVXhYqHyKaNBlITs6oMteZxdC48cAgRyTiPc33JCJhq06dOpx33nk8/vjjfPvtt6xatYqRI0eSk5PD3/72N1q0aEHXrl2ZPHkyGzduDMtZX5YuXRoyiVQk2rt3b8n9Tz/9lP/7v//j2GOPJTs7mylTpoRlYh5O4uISSE2dT2xsAjEx9YCiFvPY2KLlGgwq0ciT2Vq8otlaRKKDc47169fz6quvMnfuXNauXQtA69atSU9P59xzz6VHjx40aNDA40jFC3l5ebzyyis8++yzLFq0COcciYmJTJs2jX79+kXclIhedrnx+fLYunUO+flZ1K2bQpMmA4mLSyhju11s2zaHPXuyiY9vS+PGA5WYS1irzmwtSs5FJOJ9/fXXLFiwgPnz57No0SJ2796NmXHSSSdxxhlnlNxU1TFy/fLLLyxcuJBnn32WuXPnkp+fT3JyMkOHDuWtt94iPj4+Yr+h8Co537FjJZmZfXCukMLC3cTE1MMshtTU+SQmdgtqLCLBpuS8gpSci8jevXt5//33WbZsGStXrmTVqlXs3l00GC05OXm/ZP03v/kNZuZxxFJaZRLNwsJCMjIyeO6555g9ezbbtm2jYcOGDBw4kKFDh9KlSxfMLOIHc3rx+jR/uUS76iTnGhAqIlGlTp069OjRo6Soj8/nY926daxYsYIVK1Ywf/58Zs6cCUCTJk3o1q1bSbL+u9/9jrg4XTZDlXOOzz//nMWLF7NkyRKWLFnCDz/8QJ06dbjgggsYOnQo55133kHdViI1KS/mxeuryPzlSUmXBzkqkfCgdxkRiWpxcXGkpaWRlpbGDTfcgHOOTZs2lSTrK1eu5JVXXgGgbt26nHzyyZxyyiklt9TU1IiaYz3cfPXVVyxevLjklpubC0DLli3p27cvZ511FhdccIGm1wwyzV8uUnVKzkUkYlV0MFppZsYJJ5zACSecwJVXXgnAN998w8qVK/nggw/46KOPmD17No8//jgAsbGxnHjiiZxyyim0b9++5GegBptW5TWFg0O9rrKmBUxKSmLHjh38/PPPQNG3HL169eLMM8+kV69etGnTRl2SPKT5y0WqTn3ORSQiBXIwmnOOL7/8knXr1vHRRx+V3IpbbaFoZpji1vUTTzyRlJQU2rRpQ/36Ve9nG6kD7Mp7Xc2aPcc339Rn2LBh7N69m507d7Jnzx6g6BuPo446igYNGjB37lzatWunZDyEqM+5RDsNCK0gJeci0cGrxGDr1q37JesfffQRWVlZ+22TlJRE27ZtSUlJ2e9n27ZtD5m4R2qy4/Pl8dZbzcnJ2cX//sd+tx07ft0uMTGRzp078/nnn5OYmMiaNWuIjY31JmipkEj9MClSERoQKiJSileD0Zo0aULv3r3p3bt3ybJdu3aRlZVFdnY2WVlZJffffPNNvv/++/32b9asWUmy3qZNG5o3b07Tpk1p2rQpsJhffikgpozScaE+wK6wsJDt27fz3Xff8f333/Pll1/y6aef8tlnn5GZmcHWrbtKto2Ph9atoWtXSE6uTbdu19C9+00kJSXtN7OK14l5pHYvqkmJid3o0iVX85eLVJKScxGJOKE0GK1+/fol3VsOlJeXR05Ozn7Je3Z2NgsWLOC7774r83hHHgkNGkDDhr/+bNhwN23avEJqanOOPvpo6tatS3x8PHXr1i251alTp8a6ffh8Pvbt20d+fj5bt24tSbq/++67/e4X/9y6dSsFBQX7HaNevXq0a9eOM85oSePGO2ndGpKToXFj+DXMfbRsWYfmzZvXSNw1pawW4ZycUWoRLkNcXP2Q/dAoEqqUnItIxAmXwWgJCQm0b9+e9u3bH7Ruz549fP/99yUJ7qZN/2HTpjls3/4LP/0EP/4IGzfCTz9Bfj7AfP+tbGaGmRETE0OzZs0OSt6dc+zbt499+/axd+/ekvtlPS4sLPtbCYBatWrRtGlTmjVrRvPmzenQoQPNmjUrWda0aVNatmxJq1atiImJITd3OtnZIyv8t/J62kOfL4/MzD77dS8qjj0zs0/Ydi8SkdCh5FxEIk6TJgPJyRlV5jqzGBo3HhjkiCovPj6e5ORkkpOTAfD5zmL16tcoKPjloG337atP69ar2L59Fz/++CP5+fnk5+ezZ8+ekvv5+fk89dRTFBYWcs455xy0PiYmhvj4eBITE6lduzZ16tShdu3a+90OXHbEEUfQpEmT/ZLvBg0aVKqFPtz+Vpq/W0QCTcm5iEScuLgEUlPnlzsYLRxbNg/1mjp1mk9iYuphj7F8+XIAZsyYEehwKyzc/lah1GVKRCKTknMRiUiROBitKq+prDnCSy/zupsIhNffKly6TIlI+FJyLiIRKxIHo0Xia4LweV3h1g1HRMKPknMRkQhWumW8uMU8FFrLw1W4dcMRkfCj5FxERKQSwqkbjoiEHyXnIiIilRQu3XBEJPwoOReR/ajyYeRSdxYRkdCn5FxESqjyoYiIiLdivA5AREJD6cqHxdPEFRbupqCgaLnPt8vjCEVERCKfknMRASpW+VBEREQCS8m5iACqfCgiIhIKlJyLCPBr5cOyqPKhiIhIcCg5FxGgqPKhWdmXBFU+FBERCQ4l5yIC/Fr5MDY2oaQFPSamHrGxCap8KCIiEiSaSlFESqjyoYiIiLeUnIvIflT5UERExDvq1iIiIiIiEiKUnIuIiIiIhAgl5yIiIiIiIULJuYiIiIhIiFByLiIiIiISIpSci4iIiIiECCXnIiIiIiIhQsm5iIiIiEiIUHIuIiIiIhIilJyLiIiIiIQIJeciIiIiIiFCybmIiIiISIiI8zoAERGRaOfz5bF16xzy87OoWzeFJk0GEheX4HVYIuIBJeciIiIe2rFjJZmZfXCukMLC3cTE1CMnZxSpqfNJTOzmdXgiEmTq1iIiIuIRny+PzMw+FBTkUVi4G4DCwt0UFBQt9/l2eRyhiASbJ8m5mTU0s4VmluX/2aCMbc40s3Wlbj+bWX//uqfN7MtS69oH/1WIiFSOz5dHbu50cnJGk5s7HZ8vz+uQxGNbt87BucIy1zlXyLZtc4IckYh4zatuLWOARc65e81sjP/x6NIbOOeWAO2hKJkHsoF3Sm1ys3Pu5SDFKyJSLeq6IGXJz88qaTE/UGHhbvbsyQ5yRCLiNa+6tfQDnvHffwbof5jtBwALnHN7AhqViEgAqOuClKdu3RRiYuqVuS4mph7x8W2DHJGIeM2r5Lypc26L//53QNPDbD8ImH3AsnvM7BMzm2Jmdcrb0cyGmVmGmWVs27atGiGLiFRNpHddUHedqmvSZCBmZb8Vm8XQuPHAIEckIl4LWLcWM3sXaFbGqttLP3DOOTNzhzhOEpAKvF1q8a0UJfW1gWkUdYkZX9b+zrlp/m1IS0sr93lERAIlkrsuqLtO9cTFJZCaOv+g36FZDKmp84mLq+91iCISZAFLzp1zZ5e3zsy+N7Mk59wWf/K99RCHuhB41Tn3S6ljF7e67zWzp4CbaiRoEZEAKO66UFaCHs5dF0p31ylW/BozM/vQpUuukssKSEzsRpcuuWzbNoc9e7KJj29L48YD9bsTiVJedWuZB1zsv38x8Nohth3MAV1a/Ak9ZmYU9Vf/NAAxiojUiEjtuhDp3XWCKS6uPklJl9OmzSSSki5XYi4SxbxKzu8FzjGzLOBs/2PMLM3MphdvZGatgZbAsgP2f87MMoFMoBFwdxBiFhGpkuKuC7GxCSWD/2Ji6hEbmxDWXRciubuOiIhXPJlK0Tm3HTirjOUZwBWlHv8PaFHGdr0CGZ+ISE2LxK4LkdpdR0TES17Ncy4iEnWKuy5EiiZNBpKTM6rMdeHcXUdExEtedWsREZEwF6nddUREvKSWcxERqbJI7K4jIuIlJeciIlItkdZdR0TES+rWIiIiIiISIsy56CmaaWZ5wCav45CQ0wj4wesgJOTovJCy6LyQsui8kAMd75xLqMqO0datZZNzLs3rICS0mFmGzgs5kM4LKYvOCymLzgs5kJllVHVfdWsREREREQkRSs5FREREREJEtCXn07wOQEKSzgspi84LKYvOCymLzgs5UJXPiagaECoiIiIiEsqireVcRERERCRkKTkXEREREQkREZ2cm9mfzewzMys0s3KnODKz88xsk5llm9mYYMYowWdmDc1soZll+X82KGe7AjNb57/NC3acEniH+983szpmNse//gMzax38KCXYKnBeXGJm20pdH67wIk4JLjObYWZbzezTctabmf3Df958YmYdgh2jBF8FzoueZraz1PVi7OGOGdHJOfAp8EdgeXkbmFks8CiQDrQDBptZu+CEJx4ZAyxyzqUAi/yPy5LvnGvvv10QvPAkGCr4v3858JNzri0wBbgvuFFKsFXiPWFOqevD9KAGKV55GjjvEOvTgRT/bRjwryDEJN57mkOfFwArSl0vxh/ugBGdnDvnNjjnDlcRtBOQ7Zz7wjm3D3gB6Bf46MRD/YBn/PefAfp7GIt4pyL/+6XPlZeBs8zMghijBJ/eE6RMzrnlwI+H2KQfMNMVeR9INLOk4EQnXqnAeVFpEZ2cV1ALYHOpx9/4l0nkauqc2+K//x3QtJztjjCzDDN738yUwEeeivzvl2zjnPMBO4GjgxKdeKWi7wl/8nddeNnMWgYnNAlxyiekPF3M7GMzW2Bmvz3cxnHBiCiQzOxdoFkZq253zr0W7HgkNBzqvCj9wDnnzKy8+URbOee+NbPjgMVmlumcy6npWEUk7LwOzHbO7TWz4RR9u9LL45hEJDR9SFE+scvM+gBzKer6VK6wT86dc2dX8xDfAqVbPY7xL5Mwdqjzwsy+N7Mk59wW/1eOW8s5xrf+n1+Y2VLgFEDJeeSoyP9+8TbfmFkccBSwPTjhiUcOe14450qfA9OByUGIS0Kf8gk5iHPu/0rdn29mj5lZI+fcD+Xto24t8F8gxcySzaw2MAjQzByRbR5wsf/+xcBB37CYWQMzq+O/3wg4HVgftAglGCryv1/6XBkALHaq3BbpDnteHNCP+AJgQxDjk9A1D/irf9aWzsDOUl0oJUqZWbPisUpm1omi3PuQjTxh33J+KGb2B2Aq0Bh408zWOed6m1lzYLpzro9zzmdm1wJvA7HADOfcZx6GLYF3L/CimV0OfAVcCOCfbvMq59wVwInAE2ZWSNE/0r3OOSXnEaS8/30zGw9kOOfmAU8Cs8wsm6IBP4O8i1iCoYLnxXVmdgHgo+i8uMSzgCVozGw20BNoZGbfAHcCtQCcc48D84E+QDawB7jUm0glmCpwXgwA/mZmPiAfGHS4Rh5TI5CIiIiISGhQtxYRERERkRCh5FxEREREJEQoORcRERERCRFKzkVEREREQoSScxERERGREKHkXEQkzJiZM7NnSz2OM7NtZvaG//EFZjYmgM9/l5ndVM66VZU81rVmlu1/TY1qJkIRkfCl5FxEJPzsBk4ys7r+x+dQqhKhc26ec+7eihzIXzClxt4LnHNdK7nLe8DZFNUcEBGJekrORUTC03ygr//+YGB28Qozu8TM/um/39TMXjWzj/23rmbW2sw2mdlM4FOgpZkNNrNMM/vUzO4rdazzzOxD/76LSj1/OzNbamZfmNl1pbbf5f/Z08yWm9mb/ud6vKwPAc65j5xz/6vB34uISFhTci4iEp5eAAaZ2RHAycAH5Wz3D2CZc+53QAeguAJyCvCYc+63wC/AfUAvoD3Q0cz6m1lj4N/An/z7/7nUcU8AegOdgDvNrFYZz90JGAG0A9oAf6zqixURiRZKzkVEwpBz7hOgNUWt5vMPsWkv4F/+fQqcczv9y79yzr3vv98RWOqc2+ac8wHPAd2BzsBy59yX/v1/LHXcN51ze51zPwBbgaZlPPca59wXzrkCilr2u1XhpYqIRJU4rwMQEZEqmwc8APQEjq7kvrur+dx7S90voOz3E3eYxyIicgC1nIuIhK8ZwDjnXOYhtlkE/A3AzGLN7KgytlkD9DCzRmYWS1Fr/DLgfaC7mSX7929Yyfg6mVmyv6/5QGBlJfcXEYk6Ss5FRMKUc+4b59w/DrPZ9cCZZpYJrKWo//eBx9kCjAGWAB8Da51zrznntgHDgFfM7GNgTiVD/C/wT2AD8CXw6oEbmNl1ZvYNcAzwiZlNr+RziIhEFHNO3zKKiEjNMrOewE3OufO9jkVEJJyo5VxEREREJESo5VxEREREJESo5VxEREREJEQoORcRERERCRFKzkVEREREQoSScxERERGREKHkXEREREQkRPw/jD1xuBAjaBMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-1, 1.5, 50)\n",
    "# print(x)\n",
    "#从-1到1.5等间距取出50个数\n",
    "xx, yy = np.meshgrid(x, x)\n",
    "# print(np.meshgrid(x,x))\n",
    "# print(xx);print(yy)\n",
    "#将x里的数组合成50*50=250个坐标\n",
    "z = np.array(feature_mapping(xx.ravel(), yy.ravel(), 6))\n",
    "z = z @ final_theta\n",
    "z = z.reshape(xx.shape)\n",
    "\n",
    "plot_data()\n",
    "plt.contour(xx, yy, z, 0, colors='black')\n",
    "#等高线是三维图像在二维空间的投影，0表示z的高度为0\n",
    "plt.ylim(-.8, 1.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cost(theta, X, y):\n",
    "    first = (-y) * np.log(sigmoid(X @ theta))\n",
    "    second = (1 - y)*np.log(1 - sigmoid(X @ theta))\n",
    "    return np.mean(first - second)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient(theta, X, y):\n",
    "    return (X.T @ (sigmoid(X @ theta) - y))/len(X)  \n",
    "# the gradient of the cost is a vector of the same length as θ where the jth element (for j = 0, 1, . . . , n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [],
   "source": [
    "def costReg(theta, X, y, l=1):\n",
    "    # 不惩罚第一项\n",
    "    _theta = theta[1: ]\n",
    "    reg = (l / (2 * len(X))) *(_theta @ _theta)  # _theta@_theta == inner product\n",
    "    return cost(theta, X, y) + reg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6931471805599454"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "costReg(theta, X, y, l=1)  #     0.6931471805599454"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradientReg(theta, X, y, l=1):\n",
    "    reg = (1 / len(X)) * theta\n",
    "    reg[0] = 0  \n",
    "    return gradient(theta, X, y) + reg\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([8.47457627e-03, 1.87880932e-02, 7.77711864e-05, 5.03446395e-02,\n",
       "       1.15013308e-02, 3.76648474e-02, 1.83559872e-02, 7.32393391e-03,\n",
       "       8.19244468e-03, 2.34764889e-02, 3.93486234e-02, 2.23923907e-03,\n",
       "       1.28600503e-02, 3.09593720e-03, 3.93028171e-02, 1.99707467e-02,\n",
       "       4.32983232e-03, 3.38643902e-03, 5.83822078e-03, 4.47629067e-03,\n",
       "       3.10079849e-02, 3.10312442e-02, 1.09740238e-03, 6.31570797e-03,\n",
       "       4.08503006e-04, 7.26504316e-03, 1.37646175e-03, 3.87936363e-02])"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gradientReg(theta, X, y, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(array([ 1.27271027,  0.62529965,  1.18111686, -2.019874  , -0.91743189,\n",
      "       -1.43166929,  0.12393227, -0.36553118, -0.35725404, -0.17516293,\n",
      "       -1.4581701 , -0.05098418, -0.61558556, -0.27469165, -1.19271299,\n",
      "       -0.24217841, -0.206033  , -0.04466178, -0.27778949, -0.29539514,\n",
      "       -0.45645981, -1.04319154,  0.02779373, -0.29244867,  0.0155576 ,\n",
      "       -0.32742405, -0.1438915 , -0.92467487]), 32, 1)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(array([ 1.02253248,  0.56283944,  1.13465456, -1.78529748, -0.66539168,\n",
       "        -1.01863181,  0.13957059, -0.29358911, -0.30102279, -0.08324364,\n",
       "        -1.27205982, -0.06137378, -0.53996494, -0.17881797, -0.94198718,\n",
       "        -0.14054843, -0.17736656, -0.07697368, -0.22918936, -0.21349659,\n",
       "        -0.37205336, -0.86417647,  0.00890082, -0.26795949, -0.0036225 ,\n",
       "        -0.28315229, -0.07321593, -0.75992548]),\n",
       " 57,\n",
       " 1)"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result2 = opt.fmin_tnc(func=costReg, x0=theta, fprime=gradientReg, args=(X, y))\n",
    "print(result2)\n",
    "result2 = opt.fmin_tnc(func=costReg, x0=theta, fprime=gradientReg, args=(X, y, 2))\n",
    "result2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "                   intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                   multi_class='auto', n_jobs=None, penalty='l2',\n",
       "                   random_state=None, solver='lbfgs', tol=0.0001, verbose=0,\n",
       "                   warm_start=False)"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn import linear_model#调用sklearn的线性回归包\n",
    "model = linear_model.LogisticRegression(penalty='l2', C=1.0)\n",
    "model.fit(X, y.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8305084745762712"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.score(X, y)  # 0.8305084745762712"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8050847457627118"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "final_theta = result2[0]\n",
    "predictions = predict(final_theta, X)\n",
    "correct = [1 if a==b else 0 for (a, b) in zip(predictions, y)]\n",
    "accuracy = sum(correct) / len(correct)\n",
    "accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.85      0.75      0.80        60\n",
      "           1       0.77      0.86      0.81        58\n",
      "\n",
      "    accuracy                           0.81       118\n",
      "   macro avg       0.81      0.81      0.80       118\n",
      "weighted avg       0.81      0.81      0.80       118\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'\\n                 precision    recall  f1-score   support\\n\\n              0       0.87      0.75      0.80        60\\n              1       0.77      0.88      0.82        58\\n    \\n    avg / total       0.82      0.81      0.81       118\\n '"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(classification_report(y, predictions))\n",
    "\n",
    "'''\n",
    "                 precision    recall  f1-score   support\n",
    "\n",
    "              0       0.87      0.75      0.80        60\n",
    "              1       0.77      0.88      0.82        58\n",
    "    \n",
    "    avg / total       0.82      0.81      0.81       118\n",
    " '''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-0.8, 1.2)"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAucAAAHjCAYAAACAfrFDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xl8lOW99/HPNTPZE8gOIewQIEjYDGoUNVoXihZr1YNrFz217TldfHy62KfntE+X87TVtufUHttzPHY/p0htrVJF3IOiKIsiQbYkQCAJkJAQyEaSmbmeP7I0YAiBzMx9J/N9v17zgtwzc9/fMCH55ZrfdV3GWouIiIiIiDjP43QAERERERHpouJcRERERMQlVJyLiIiIiLiEinMREREREZdQcS4iIiIi4hIqzkVEREREXELFuYiIiIiIS6g4FxERERFxCRXnIiIiIiIu4XM6QCRlZmbayZMnOx1DREREREawzZs3H7HWZp3Lc6OqOJ88eTKbNm1yOoaIiIiIjGDGmMpzfa7aWkREREREXELFuYiIiIiIS6g4FxERERFxiajqORcRERGRLp2dnVRVVXHixAmnowxb8fHxjB8/npiYmJCdU8W5iIiISBSqqqoiJSWFyZMnY4xxOs6wY62lvr6eqqoqpkyZErLzqq1FREREJAqdOHGCjIwMFebnyBhDRkZGyN95UHEuIiIiEqVUmA9NOP79VJyLiIiIiLiEinMRERERGZTi4mKKi4tDes6nnnoKYww7d+4M6XlP59/+7d9obW09q+eUlJRw/fXXhynRyVSci4iIiIhjVqxYweLFi1mxYkVErncuxXkkqTgXEREREUc0Nzezbt06fvnLX/L444/3Hv/hD39IQUEB8+bN44EHHgCgvLycq666innz5rFw4UIqKioAeOihh1i0aBFz587lW9/6FgD79u1j1qxZ3HHHHeTn53PzzTfT2trKww8/TE1NDVdccQVXXHEFAC+88AJFRUUsXLiQW265hebmZgDWrFnDrFmzWLhwIU8++WTE/k20lKKIiIiInFbfNpa1a9d+4FhJSck5n/vpp59myZIlzJgxg4yMDDZv3kxtbS1PP/00b7/9NomJiTQ0NABwxx138MADD3DjjTdy4sQJgsEgL7zwAmVlZWzYsAFrLcuWLeO1115j4sSJ7Nq1i1/+8pdccskl3H333fz85z/ny1/+Mj/5yU949dVXyczM5MiRI3zve9/jpZdeIikpiR/+8If85Cc/4atf/Sqf/vSneeWVV5g+fTrLly8/58/xbGnkXEREREQcsWLFCm699VYAbr31VlasWMFLL73Epz71KRITEwFIT0+nqamJ6upqbrzxRqBr85/ExEReeOEFXnjhBRYsWMDChQvZuXMnZWVlAEyYMIFLLrkEgDvvvJN169Z94PpvvfUW27dv55JLLmH+/Pn89re/pbKykp07dzJlyhTy8vIwxnDnnXdG4p8D0Mi5iIiIiAyg78h4z4j5UEbLezQ0NPDKK69QWlqKMYZAIIAxhltuuWXQ57DW8vWvf53PfOYzJx3ft2/fB5Y57G/ZQ2stV1999Qf63bds2XIWn0loaeRcRIYlv7+JmprHqKj4GjU1j+H3NzkdSUREzsKf/vQn7rrrLiorK9m3bx8HDhxgypQpjB49ml//+te9kzYbGhpISUlh/PjxPPXUUwC0t7fT2trKtddey69+9avePvHq6mpqa2sB2L9/P+vXrwfgD3/4A4sXLwYgJSWFpqaunxkXXXQRb7zxBuXl5QC0tLSwe/duZs2axb59+3r72iM1WRVUnIvIMNTYuI7163MpL7+PAwcepLz8Ptavz6Wx8YNvWYqIiDutWLGit02lx0033cTBgwdZtmwZhYWFzJ8/nx/96EcA/P73v+fhhx9m7ty5XHzxxRw6dIhrrrmG22+/naKiIgoKCrj55pt7C++ZM2fyyCOPkJ+fz9GjR/nc5z4HwL333suSJUu44ooryMrK4je/+Q233XYbc+fOpaioiJ07dxIfH8+jjz7Kddddx8KFC8nOzo7Yv4ux1kbsYk4rLCy0mzZtcjqGiAyB39/E+vW5BAIfHCn3elMoKqrB50t2IJmIyPCyY8cO8vPznY4RFvv27eP6669n27ZtYb9Wf/+OxpjN1trCczmfRs5FZFiprV2JtcF+77M2SF3dyggnEhERCR1NCBWRYaWtrYxgsKXf+4LBFlpbyyOcSPz+JmprV9LWVkZCQh7Z2cvx+VKcjiUiUWzy5MkRGTUPBxXnIjKsJCTk4fEk9VugezxJJCZOdyBV9GpsXEdp6VKsDRIMtuDxJFFRcT8FBatJTV3sdDwRkWFHbS0iMqxkZy/HmP6/dRnjISsrchtFRDu/v4nS0qUEAk29vywFgy0EAl3H/f5mhxOKiAw/Ks5FZFjx+VIoKFiN15uCx5MEdI2Ye71dxzUZNHLU/y8iEnpqaxGRYSc1dTFFRTXU1a2ktbWcxMTpZGUtV2EeYer/FxEJPRXnIjIs+XzJ5OTc43SMqKb+f5HoEo7J316vl4KCAvx+P1OmTOH3v/89qampAz7n4osv5s033zzraz311FPMmDGD2bNnn2vciFBbi4iInBP1/4tEj3Bt/paQkMCWLVvYtm0b6enpPPLII2d8zrkU5tBVnG/fvv2cnhtJKs5FROScqP9fJDpEavJ3UVER1dXVvR8/9NBDLFq0iLlz5/Ktb32r93hycvIZH/O73/2OuXPnMm/ePO666y7efPNNVq1axVe+8hXmz59PRUVFSDKHg9paRETknKn/X2TkG8zk76G2GQYCAV5++WXuuafrPC+88AJlZWVs2LABay3Lli3jtdde47LLLut9zukek5GRwfe+9z3efPNNMjMzaWhoID09nWXLlnH99ddz8803DylruKk4FxGRIVH/v8jIFs7J321tbcyfP5/q6mry8/O5+uqrga7C+4UXXmDBggUANDc3U1ZW9oHivL/HvPfee9xyyy1kZmYCkJ6efs75nKC2FhERERE5rZ7J3/0Z6uTvnp7zyspKrLW9PefWWr7+9a+zZcsWtmzZQnl5ee+oeo/BPGY4UnEuIiIiIqcVicnfiYmJPPzww/z4xz/G7/dz7bXX8qtf/Yrm5q5+9urqampra096zukec+WVV/LEE09QX18PQENDAwApKSk0NTUNOWu4qTgXERERkdOK1OTvBQsWMHfuXFasWME111zD7bffTlFREQUFBdx88829hbUxBuC0jznvvPP4xje+weWXX868efO4//77Abj11lt56KGHWLBggasnhBprrdMZIqawsNBu2rTJ6RgiIiIijtuxYwf5+fmDfrzf3+z45O/6+noWLlxIZWVlRK87kP7+HY0xm621hedyPk0IFREREZEzcnryd01NDcXFxXz5y192LEMkqDgXEREREdcbN24cu3fvdjpG2KnnXERERCRKRVN7cziE499PxbmIiIhIFIqPj6e+vl4F+jmy1lJfX098fHxIz6u2FhEREZEoNH78eKqqqqirq3M6yrAVHx/P+PHjQ3pOFeciIiIiUSgmJoYpU6Y4HUNO4WhbizHmV8aYWmPM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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-1, 1.5, 250)\n",
    "xx, yy = np.meshgrid(x, x)\n",
    "\n",
    "z = feature_mapping(xx.ravel(), yy.ravel(), 6, as_ndarray = True)\n",
    "z = z @ final_theta\n",
    "z = z.reshape(xx.shape)\n",
    "\n",
    "plot_data()\n",
    "plt.contour(xx, yy, z, 0)\n",
    "plt.ylim(-.8, 1.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2 3]\n",
      " [1 2 3]\n",
      " [1 2 3]\n",
      " [1 2 3]]\n",
      "[[11 11 11]\n",
      " [22 22 22]\n",
      " [33 33 33]\n",
      " [44 44 44]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([1,2,3])          #a.shape  (3,)\n",
    "b = np.array([11,22,33,44])    #b.shape  (4,)\n",
    "x,y = np.meshgrid(a,b)\n",
    "# 返回list,有两个元素,第一个元素是X轴的取值,第二个元素是Y轴的取值\n",
    "print(x)                              #x.shape(4,3)\n",
    "\n",
    "print(y)                             #y.shape(4,3)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.contour.QuadContourSet at 0x7f7be291f9d0>"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "a = np.array([1,2,3])\n",
    "z = np.array([[0,1,1],[1,0,1],[1,1,0]])\n",
    "x,y = np.meshgrid(a,a)\n",
    "plt.contour(x,y,z,3)          #数字3是等高线的数量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.contour.QuadContourSet at 0x7f7be29af310>"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "a = np.array([1,2,3])\n",
    "z = np.array([[0,1,1],[1,0,1],[1,1,0]])\n",
    "x,y = np.meshgrid(a,a)\n",
    "plt.contourf(x,y,z,3)         "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "x = np.array([[0, 1, 2], [0, 1, 2]])\n",
    "y = np.array([[0, 0, 0], [1, 1, 1]])\n",
    "\n",
    "\n",
    "plt.plot(x, y,\n",
    "         color='red',  # 全部点设置为红色\n",
    "         marker='.',  # 点的形状为圆点\n",
    "         linestyle='')  # 线型为空，也即点与点之间不用线连接\n",
    "plt.grid(True)\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
